今の状況
現在、あるゲームを作ろうと考えておりクラス設計から入っています
ゲーム制作自体はいくらか経験しており、ある程度のひな型は出来ているのですが...
いつも、別クラスの情報が欲しい
→ コンストラクタの引数に対して予め参照を持たせる
→ 大量の引数に加え道中のクラスのコンストラクタにも引数を渡し必要があり大変
といった事態になっております。
例
例えば、初代マリオのような2Dアクションゲームを画面分割で4人同時に遊べるゲームを作りたいとします。
各々の画面に移動に必要なゲージが用意されており、移動する度に消費される要素があります。
管理しやすくする為に、GameManagerで各Managerを生成し
GameManagerから呼ばれる、Init(), Update(), OnGameStart(), OnGameEnd()などの関数が呼ばれ
各々のマネージャにある同名の関数が呼ばれるようにします。
GameManager ├ InputManager ├ AnimManager ├ UIManager ├ PlayerManager .....└ Player * 4
そこで、今回はPlayer.Update()内にて入力を検知し、移動したいと考えました。
ですがそれには別クラスの参照がそれぞれ必要です。
具体的には
・InputManagerでボタンを十字ボタンをどれだけ押したか
そもそも移動出来る状態にあるか確認する必要があります。
・移動出来た場合は、AnimationManagerで移動アニメーションの描画
更にUIManagerで移動に応じてゲージを減らさなければなりません。
こういった状況ではいつも、先にPlayerManager以外を生成して
PlayerManagerのコンストラクタでそれぞれの弱参照を渡したりしています。
C++
1GameManager::GameManager{ 2 m_input = std::make_shared<InputManager>(); 3 m_anim = std::make_shared<AnimManager>(); 4 m_ui = std::make_shared<UIManager>(); 5 m_player = std::make_shared<PlayerManager>(m_input, m_anim, m_ui); 6} 7 8PlayerManager::PlayerManager( 9 std::weak_ptr<InputManager> input, 10 std::weak_ptr<AnimManager> anim, 11 std::weak_ptr<UIManager> ui){ 12 13 for(int i = 0; i < 4; i++){ 14 m_playerVec.push_back(Player(input, anim, ui)); 15 } 16}
正直、とても面倒です...
結局何が聞きたいのか
以下の2点です。
1 - このように別クラスの参照を多く持たなければならない場合は、どのようにするべきなのか
(引数をすべて1つの構造体で纏めるとか...?、シングルトンパターンで特定の情報だけ公開させるとか...?)
2 - そもそもこの「社長に課長から平社員まで作らせて、初日に必要書類全部渡す」スタイルが良くない気がするのですが
ゲーム設計を学ぶ上で何か参考にしたほうがいいところとかありますか?
ようやく基本構文が分かるようになったので、設計も進めていきたいです。
よろしくお願いします。
あなたの回答
tips
プレビュー