質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

641閲覧

C++でゲームのクラス設計をしていますが、別クラスの参照が必要なためコンストラクタの引数が非常に多くなってしまう

fmxezvs

総合スコア0

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2023/04/18 13:03

編集2023/04/18 13:05

今の状況

現在、あるゲームを作ろうと考えておりクラス設計から入っています
ゲーム制作自体はいくらか経験しており、ある程度のひな型は出来ているのですが...
いつも、別クラスの情報が欲しい
→ コンストラクタの引数に対して予め参照を持たせる
→ 大量の引数に加え道中のクラスのコンストラクタにも引数を渡し必要があり大変
といった事態になっております。

例えば、初代マリオのような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 - そもそもこの「社長に課長から平社員まで作らせて、初日に必要書類全部渡す」スタイルが良くない気がするのですが
ゲーム設計を学ぶ上で何か参考にしたほうがいいところとかありますか?

ようやく基本構文が分かるようになったので、設計も進めていきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/04/18 13:58

引数4つが"大量"なんですか?
ttact

2023/04/18 23:14

IoCコンテナ使えばいいんじゃないですかね?boost DIとか。 あと4つは多くないと私も思います。
Zuishin

2023/04/19 00:40

UI と Input と Animation をそれぞれ独立して渡す必要があるんでしょうか。 UI が他二つを管理すればいいのでは?
fana

2023/04/19 01:21

そもそも(?) 何でもかんでも最初に教えておかないとならないのでしょうか? {必要なときにメソッドの引数に渡す,処理結果情報を戻り値で返す}といった基本的なやり方で十分な部分はそうすれば良いだけなんじゃないのだろうか?的な. e.g. Updata()で入力情報が必要なら Update() の引数に受ければ済むのでは.
fana

2023/04/19 01:27

関係ないけど,ゲームを作る話で "XXXManager" という名前をよく見かける気がするけど,その界隈だと伝わる名前なのでしょうか? (個人的には「すっごくぼんやりしていて実際に何する役目なのかいまいちわからん」感)
Kerupim

2023/04/19 04:56 編集

この手のものは他人のソースコードを参照するのが一番手っ取り早いかと。 C++であればアンリアルエンジンをダウンロードしてきてソースコードを眺めて見てはどうでしょうか? ※Unityでもパッケージのソースコードは覗けるので、参考にはなるかと。 ※ちなみに入力系はイベントをバインドさせる形が最近のゲーム業界のトレンド?のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問