• ベストアンサー

ゲーム作りにおいてのクラス指向について

 多人数プレイ(とりあえず4人用で)用格闘ゲームを作る過程で、2週間ほど前からクラス指向を学びはじめたんですが、その構築方法のコツというか考え方がよく分かりません。  僕は今やっていることは、まずステージの状態を管理をするStageクラスとプレイヤーの状態を管理するPlayerクラスを作り、メイン関数内でPlayer1~Player4のインスタンスを宣言し、それらに各キャラクターのパラメータ(グラフィックデータなど)を設定するメンバ関数Player1.Set()~Player4.set()を呼び出しました。  同様にStageのインスタンスStage1を宣言し、位置や拡大率などのパラメータを設定するメンバ関数Stage.Set()を呼び出しました。  次に各プレイヤーとステージを表示させるメンバ関数をメッセージループ内で実行し、凸凹なステージとプレイヤー1~4の衝突判定を行うために、Playerクラス内に、Stageクラスのインスタンスや位置情報などを引数とした関数Player1.Collision()~Player4.Collision()をメッセージループ内で呼び出しました。  そして攻撃と当たり判定を実装しようと思ったのですが、この調子だと、キャラクターが攻撃したときの攻撃判定枠と、攻撃したキャラクター以外の当たり判定枠の衝突をプレイヤー分だけ条件処理させて、 Player1.Kougeki1Hantei(Player2); Player1.Kougeki2Hantei(Player2); Player1.Kougeki3Hantei(Player3); … … Player4.Kougeki100Hantei(Player3); こんなふうにクラス指向として何の価値もないプログラムに向かっているのではないかと焦りまくっています。  ともかく上記ような僕の考え方についてみなさまの辛口な意見・アドバイスをお聞きしたいのですが、一番知りたいことは、 「Player1~Player4のうち、攻撃したプレイヤーの攻撃判定枠と、その攻撃をしたプレイヤー以外のすべてのプレイヤーの当たり判定枠との衝突判定」という処理を、 Player1.Kougeki1Hantei(Player2); Player1.Kougeki2Hantei(Player2);  このような書き方以外でどうやって行えばよいのかという点です。  また勝手ながら、僕の思考回路のショートを避けるために、各々のプレイヤーやステージのインスタンスに設定する情報はほぼ一定で(ユーザがキャラクターやステージを選択できない)、動きや攻撃の種類も全員同じとします。  ではよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 プレイヤ自身が当たり判定をする必要もないのではないでしょうか。  コリジョンクラスを作って、そちらで一括してコリジョンをとって、 結果を反映する、という方式でもいいような気がします。  一例を挙げるなら、各オブジェクトがそのフレームにおける位置や大きさなどの コリジョンの形状などをコリジョンクラスに登録し、全て登録が終わった段階で 一斉にチェックします。 (基本は総当たりで。但し不必要なものは属性情報を元に弾きます)  衝突したのなら、登録時に指定したコールバックを呼んで各オブジェクトに 衝突位置や、ベクトル、各々のオブジェクトのメタデータと共に伝達する、とか。

sanato
質問者

お礼

詳しい説明ありがとうございます。 ご回答を参考にしつつ、今も四苦八苦しながら頑張ってます。 また何かあればよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

配列とループを使えばいいような気がしますが? 質問のような状況なら各攻撃の当たり範囲やPlayerのインスタンスは確実に配列にできそうですが。

sanato
質問者

お礼

回答ありがとうございます。 そこはクラス以前の問題でしたね。精進します。

すると、全ての回答が全文表示されます。

関連するQ&A