構造設計
自分が今やってるプログラムの設計の覚書。
以前作ったサンプルはクラス設計以前に構造化も何もなかった。
C言語プログラムのサンプルだったから当然なんだけど、
とにかくこいつに付け足しでコーディングするのは骨が折れる。
だから色々考えた挙句次のような感じになった。
(今後変更する可能性があるし、そもそもこれが正しいわけでもない)
ソースファイル
まずはソースファイルの分け方。
メインとなる処理
os.* | Windows固有のコード。目標はこいつ以外windows.hをインクルードしないこと。 |
graphic.* | DirectX関連のコード。(実はコイツもwindows.hがいる。) |
game.* | 有体に言えばGameManager |
main.* | gamemain関数がおいてある。Windowsより一つ上のレベルでのスタート地点。 |
サブっぽい処理
common.* | 全体に共通のconstanceやらなんやらを置く。uintとかも定義してある。 |
option.* | コマンドラインオプションを解釈・フラグ化するクラス。 |
util.* | 雑多な処理をおく |
こんな感じで分かれている。
構造
クラスの構造は今のところメイン処理のソースファイルと対応してる。
os.cpp
まずos.cppがエントリポイントとなって、ウィンドウの作成・コマンドラインの処理を行う。
os.cppによって公開されるデータは
- HWND型のウィンドウハンドル(directXに必要)
- bool型のアプリケーション終了情報(メインのゲームループの終了に必要)
- bool型のウィンドウメッセージの受信情報(メインのゲームループの処理に必要)
それ以外は隠匿される。
ウィンドウメッセージも全てここで処理してしまう。ゲームにおいて、ウィンドウズGUIのメニューバーを利用しなければならないとかでなければ、ウィンドウメッセージの処理はdestroy(破壊)だけだと思うから。この目論見が外れると痛いかも('д`)
最後に、os.cpp内のWinMainから、main.coo内のgamemainが呼び出される。
main.cpp
os.cppから受け取る情報は現在のところ一つ。Args型。
これは、実際にはstd::vector
(これを生成してるのはos.cpp内の関数。大した手間ではない。)
option.cpp
そして上のArgs型の値をさらに解釈するクラスがOptionクラス。
実行時パラメータは全てこいつに問い合わせる予定。
game.cpp
ゲームの1フレーム当たりの処理の統括。
たぶんシーンコントローラを駆動するだけ、な気がする。
中間管理職。
graphic.cpp
Direct3Dをつかさどるクラス。
とはいえ、恐らく他にも細々としたクラスを作ることになる。
次に作る予定はSprite。2Dのグラフィックスには絶対必要だからなー。
('ω`)
今のところこんな感じ。
hmx,ドーナツ、ひろ氏、id:peregrinationの参考になればいいね。