ここまでの冒険を記録しますか?スマートフォン用の表示で見るここまでの冒険を記録しますか?長岡技大ソフトウェア開発サークルの開発ブログこの広告は、90日以上更新していないブログに表示しています。書き手:肥田野DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。この連載は前回までの内容を理解していることを前提に進めていきます。前回メッセージウィンドウのテスト表示をしたので、今回からはいよいよイベントとしてマップに実装していきます。......が、その前に。段々ヘッダファイルが増えてきてプロジェクトが混沌としてきましたね。once」を付けているとは言え、色々なクラスが他のクラスを参照するので、インクルードの順番やヘッダファイル同士の関係性が分かりにくくなってきました。いうか私がエラーを頻発させて頭を抱えていたので、OBの方の知恵をお借りして、プロジェクト全体を整理したいと思います。その上でイベントの実装をしたいので、今回の項目は前後編に分けました。前編はファイルの整理に絞って解説します。※おことわり(15.06.20追記)当記事執筆時に気が付かなかった不具合(カメラが動かない)が確認できたので、第11.5回で修正方法を解説しています。記事の通りに編集しても問題なくコンパイルできると思いますが、正常な動作はできなくなっています。当連載を11.5回まで読み進めれば、不具合は修正されますのでご了承ください。ソースを読む前に、この整理におけるルールを解説します。今までは「Main.cpp」を除いて、クラスや関数の宣言、定義を同一のヘッダファイルで行ってきました。今後はヘッダファイルではクラスや関数の宣言しか行わず、定義は各ヘッダファイルに対応させたcppファイルを新たに作成し、その中で行います。「それではファイルの数が倍になって、なお分かりにくくなるのでは?」という疑問もあるかと思います。原則同じ名前(例:Player.hとPlayer.cpp)を付けるので管理しにくくはなりませんし、何より「循環参照」と呼ばれるエラーを防ぐことができます。循環参照の詳細については各自でググってもらうとして、この整理を怠ると私のように数百単位でエラーを吐かれる事になりますから、こういうルールがあるんだと言う事で覚えておいてもらえればと思います。それでは前回作ったWindowBox.hとWindowBox.cppを実例にもう少し詳しく解説します。All();};非常にすっきりしていますね。ここではクラスの中にどんな型・名前の物が入っているかしか決めません。実際にコンストラクタやView関数でどんな作業を実行するのかは、次のWindowBox.cppで定義します。他のヘッダファイルやクラスは参照しないので、#includeを付ける必要はありません。once」だけは忘れないようにしましょう。}}ここで初めてヘッダファイルをインクルードします。インクルードするのは、自身が必要としているファイルだけ。onceなどで多重インクルードされないようになっているので、他のヘッダファイルとの重複を気にする必要もありません。いざクラスのメンバ関数(メソッド)を定義しようとしても、そのままだと何故かアクセスできません。クラスの外側でメソッドを定義する場合、メソッド名の前に「クラス名::」を付ける必要があります。今回の場合も、ファイル名を同じにしているのは人間が見やすいからであって、コンピュータの内部的には別々の処理ですから、「この関数はこのクラスに属していますよ」と教えてやらないといけないんです。逆に言えば、こうして所属するクラスを明示することで、そのクラスのメンバ変数を使うことができるんですね。この作業をこれまでに作った全てのヘッダファイルに行います。原則として、ヘッダファイルのインクルードはcppファイルで行うのがキモです。ヘッダファイルの方で注意しなければならないことがあるので、次のControl.hの例を見てください。All();};Controlクラスはメンバ変数に他のクラスのポインタを持つため、そのヘッダファイル単体では参照できません。先頭で#includeを使うと、先ほどのルールに反してしまいます。参照したいクラス名;」と書いてやることで解決できます。これは「プロトタイプ宣言」と呼ばれる手法で、「まだ定義してないけど、後でこういうクラスを定義しますよ」と示すことができます。自作の関数を使うときにもプロトタイプ宣言が重宝されます。今回のクラス内における関数の宣言も、ある意味でプロトタイプ宣言といえますね。これでControlクラス内にPlayerクラスやMapクラスのポインタを持たせることができました。i=0;i<3;i++)map[i]->FrontView();}Controlクラスの中身は大きな変更がありませんが、一つだけ見慣れないヘッダファイルをインクルードしていますね。define.hは、その名の通りプロジェクト全体で使う定義文をまとめたファイルです。以下のようになります。false;歩行アニメーション表示時に使うWALKTIMEや、マス目のサイズを定義したCELL_WIDTHなどをまとめています。グローバル変数viewXやviewYもここで宣言させています。グローバル変数の前に「static」を付けたのですが、何故かこれを付けないと多重定義のエラーが出てしまうので、付けておくものだと考えておいてください。詳細な理由が分かったら捕捉します。ちなみにstatic自体は、関数内で宣言した変数に、関数から抜けた後も値を保持していて欲しい時に付け加えます。define.hだけは例外的にcppファイルを作る必要はありません。この内容を宣言と定義に分けても仕方がないですからね。あとは同様に全てのファイルに対応するcppファイルを作るのですが、Function.hだけ少し異なるので掲載しておきます。PushKey(int);Function.hの中身もクラスではないので、これは関数のプロトタイプ宣言と言えますね。驚くかもしれませんが、関数をプロトタイプ宣言するときには引数の名前は不要になります。型だけでいいんですよ。false;}中身はこのようになっています。hitAnyKeyをstatic宣言したところ、何故かControlクラスのAll関数でリセットできなくなってしまったので、PushKeyの仕様を暫定的に修正しています。他は変化がないですね。今回の解説はここまでです。あとのヘッダファイルもこのルールに従って直しておいてください。次回は後編、イベントとしてのメッセージボックスの実装になります。参加グループプログラミングはてなブログをはじめよう!NUT_SoftwareDevelopperさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。