- ベストアンサー
C++言語でゲームを作る際の配列の共有について
- 質問者はC++言語でゲームを作っているが、敵のビット(武装)を管理するために配列を共有したいと考えている。
- 具体的には、CBoss1_ringクラスで生成したCBoss1_bitをCBoss1_ringクラスのs_bit配列に格納し、CBoss1_1_Groupクラスのbit配列でもs_bit配列のCBoss1_bitのメソッドを使用したいという要望を持っている。
- 質問者はどのように配列の共有を実現すべきか、または別の解決策があるかを知りたいとしている。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
CBoss1_ringクラスとCBoss1_1_Groupクラスの両方で共有したいものだけを持つ「基本クラス」を作ります。 つまり、CBoss1_Baseクラスを新たに作り、そのクラスにs_bit配列を持たせ、MoveやDrawメソッドも、このクラスに作ります。 あとは、基本クラスであるCBoss1_Baseクラスから派生させ、上位クラスのCBoss1_ringクラスとCBoss1_1_Groupクラスを作ります。 CBoss1_ringクラスもCBoss1_1_Groupクラスも「自分の元になった、下位の基本クラスであるCBoss1_Baseクラスを使える」ので、CBoss1_Baseクラスを共有する事になります。 例えば、横スクロールシューティングゲームで 自分:上下左右に自由に移動 敵:上下に自由に移動 自分の弾1:右のみ移動 自分の弾2:右に重力引かれて落下 敵の弾:発射地点から自由な方向に直進 となっていたとします。 こういう場合は 全オブジェクト共通のBaseクラスに、座標を持つPosメンバ変数、指定座標に移動させるMoveメソッドを作る 「自分」をBaseクラスから派生させ、キーパッドの入力に従ってMoveメソッドを呼ぶ 「敵」をBaseクラスから派生させ、ランダムで上下どちらかに動くか決めてMoveメソッドを呼ぶ 「自分の弾1」をBaseクラスから派生させ、右に移動するようにMoveメソッドを呼ぶ 「自分の弾2」をBaseクラスから派生させ、右に落下移動するようにMoveメソッドを呼ぶ 「敵の弾」をBaseクラスから派生させ、どの方向に飛ぶかのメンバ変数を追加して、その変数に従って移動するようにMoveメソッドを呼ぶ で、この時「自分の弾は、敵とだけ衝突する」と言うなら、Moveメソッドを呼んだ後に、別のオブジェクトと衝突しているか判定するHit_Checkメソッドを呼べば良いです。 この時「落下する自分の弾2は地面にも衝突する」と言う場合には、「自分の弾2」のクラスにHit_Checkメソッドをオーバーライドして地面衝突判定を追加したHit_Checkメソッドを作ります。 具体的には「基本クラスのHit_Checkメソッドを呼び、衝突してたら結果を持って関数を終了、衝突してなかったら地面と衝突判定して結果を持って関数を終了」という書き方をします。 同じく「敵の弾は自分とだけ衝突する」と言う場合には、Moveメソッドを呼んだ後に、別のオブジェクトと衝突しているか判定するHit_Checkメソッドを呼べば良いです。 派生について簡単に書くと、例えば 基本オブジェクト⇒キャラと弾の2つを派生 キャラオブジェクト⇒自分と敵を派生 弾オブジェクト⇒自分の弾と敵の弾を派生 自分の弾⇒直進弾と落下弾を派生 敵の弾⇒直進弾と誘導弾を派生 のようにします。 基本オブジェクトには「座標変数」とか「座標移動する移動メソッド」とか「表示メソッド」とか「座標を返すメソッド」など、すべてのオブジェクトに共通のものを入れます。 (「座標移動する移動メソッド」以外で座標が書き換わると困るので、座標変数は上位クラスからは見えないプライベート変数にしましょう) キャラオブジェクトには「自分が発射した弾のテーブル」など、敵味方のキャラクターオブジェクトに共通のものを入れます。 このように「共通で使う物は基本クラスにする」と言う書き方をしましょう。 こうすれば「座標を知りたい」のなら、該当オブジェクトの基本クラスの「座標を返すメソッド」を呼ぶだけで済み、該当オブジェクトの種類は一切気にしなくて良いのです。 Windowsのアプリを作る時も、ボタンやエディットボックスやメニューなどの「GUIコントロールオブジェクト」は「座標と大きさなど、どのクラスでも必ず要るもの」を「基本クラス」として定義し、その基本クラスから派生させて、ボタンにはボタンのキャプションを追加、エディットボックスにはエディットテキストを追加する、などのメンバ追加やメソッド追加、メソッドのオーバーライドを行い、さまざまなコントロールオブジェクトを管理します。