• ベストアンサー

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

 多人数プレイ(とりあえず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

  • RPGゲーム オブジェクト指向

    どうもオブジェクト指向をかんがえると どうもこんがらがる者です。 オブジェクト指向でRPGゲームを作成しようと思い立ちました。 そこでひとまず、マップとキャラクターの構成を下記のように 考えてみました。(フィールドやメソッドの説明は割愛します。) ※ 親<-子 ◇-集約を表す <キャラクター関連> キャラクタ <┬ ファイター <┬ 自キャラ         │         └ 敵キャラ         └ 町の人 <マップ関連> フィールド ◇┬マップ(マップ配列を管理する)          └町の人[ ] この時に、自キャラクラスがフィールドクラス (マップの情報を管理するクラス)をインスタンスとして保持する ことを思いついたのですが(キャラクタの現在位置という意味で) そう考えると、自キャラがフィールドを持つことで 町の人を持っている状態になり、おかしいような気がしました。 根本的に間違っているかもしれませんので なんでもいいのでご意見お願いします

    • ベストアンサー
    • Java
  • オブジェクト指向 ボールの衝突

    こんにちは。javaをはじめて3ヶ月くらいなのですが、オブジェクト指向でうまくプログラムを書くことができません。オブジェクト指向の理解のために、簡単なプログラムを作っていて疑問がわきました。 JPanel上をクリックすると、ボールが発生して動くプログラムをつくっています。クラスBallをつくり、クリック時にインスタンス化されます。そのときボールの発生位置や、初速度が乱数で決まるようにしました。 ここで、ボールとボールが接したときに跳ね返るようにしたいのですが、各Ballオブジェクトは衝突時点における全てのBallオブジェクトを持っていなければならないのでしょうか?(クリックするごとにArrayListなどにBallオブジェクトをいれて、各ボールの衝突判定のときにそのArrayListを渡す) でもこれだと、処理が遅くなってしまいそうで、心配なのですが、他にいい案はないでしょうか?

    • ベストアンサー
    • Java
  • クラスの参照渡しとメンバ変数の速度は?

    ゲームプログラミングを勉強中の者です。 落ち物パズルゲームを作ろうとしているんですが、 現在、クラスの設計を ゲームステージのクラスがあり、そのクラスのメンバとして各プレイヤーのクラスを入れている、つまり //プレイヤーのクラス class Player{ (ステージなどのデータのメンバ変数) void showStage(); //このあたりが質問の内容です void update(); }; // ゲームステージのクラス class Stage{ Player p; //StageクラスのメンバとしてPlayerを含める (その他ステージのメンバ変数) void play(); // メインの関数 }; のようになっていて、 実行の際はStageクラスのplayの中にゲームの内容(入力、更新、表示のループなど)が全て入っていて、playの中で別の関数を呼び出したりしているのですが、 プレイヤーごとに処理した方が楽なもの、例えばプレイヤーごとの入力などは、今は関数playの中で void Stage::play(){ (中略) p.update(); (中略) } のように、StageのメンバのPlayerクラスのpからp.xxxという形で呼び出しています。 しかし、最近読んだ本では、 playerクラスはnewで作成して、こういう関数は参照渡しで実行する、つまり class Player{ (略) }; class Stage{ void player_update(player* p);  (略) void play(); }; void Stage::play(){ (中略) Player* p = new Player(); // プレイヤークラスを作成し (中略) player_update(*p); // 参照渡しする (中略) } とするべきのようなことが書いてありました。 updateの中ではかなりplayerのメンバ変数を参照・変更したりするのですが、両者の方法では後者の方が速さの面で有利なのでしょうか? 違いがあるとすれば、どの程度速さに影響するのでしょうか? ポインタを最近使い始めたばかりで記述自体合っているかあまり自信がないのですが、宜しくお願いします。

  • phpのオブジェクト指向でつまづきました・・・

    phpのプログラムをオブジェクト指向で書こうと思ったのですが、クラス間のデータのやり取りのあたりでつまづきました。 クラスはそれぞれ 1.設定用 2.データの読み書き用 3.入出力用 4.データ処理用 5.メイン です。 オブジェクト指向で書く前よりはコードも見やすくなったのですが、例えば4のデータ処理のところからは1、2、3の全てのプロパティを参照していたりして、なんだか複雑に。 オブジェクト指向で検索するとwikipediaには プログラムを構成するコードとデータのうちコードについては手続きや関数といった仕組みを基礎に整理され、その構成単位をブラックボックス とすることで再利用性を向上し、部品化を推進する仕組みが提唱され構造化プログラミング (structured programming) として1967年にエドガー・ダイクストラ (Edsger Wybe Dijkstra) らによってまとめあげられた と書いてありました。これだと関数を種類ごとにまとめただけであまり部品化はされておらず、前と変わらないような気がしてしまって・・・ 例えば設定用のクラスはのプロパティほとんどすべての所で値が必要になるのですが、毎回newを使うのは気が引けるので、クラスの外で new でインスタンス化して必要なところから毎回 global で呼び出したりしているんですが・・・使い方が間違っている気がするのですが、そういったことを解説しているサイトが見当たらなかったため、全く分からない状態です。そもそもこの場合、設定用の値はクラスにまとめるべきなのかどうか・・・。 書く時は$クラスー>メンバ変数 とか $クラスー>メンバ関数 のように書くので今何をしているのかが分かりやすく、それは便利だと思うのですが。 すみません。自分でも上手く説明できずによくわからない文章になってしまいましたが、結局の所オブジェクトがどんな物でどんな書き方をすれば良いかが分かっていないのだと思います。そういった所を分かりやすく教えてください。お願いします。

    • ベストアンサー
    • PHP
  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • C++でのブロック崩しゲームの作成に関して

    初めまして。C++で動くブロック崩しを作成していますがそれに関して2つ質問させて頂きます。 (1)オブジェクト指向によるブロック、パドルでのクラス宣言 オブジェクト指向に基づきプログラミングをしており、パドル、ブロック、ボールといった物体をクラス定義しそれらをゲームクラスで統括する方法をとっています。また、他クラスのインスタンスやメソッドはgetter/setter関数で取得し、その際に参照するクラスの宣言は"const Ball& ball"の様に行っています。 他クラスを参照する必要のある場合は、例えばBlockクラス内でBallとの衝突判定や衝突応答を行いたい時に宣言を行っています。衝突判定ならばBoolean型を返すだけなのでconstで宣言出来るのですが、衝突応答ではボールを反射させる(ボールの速度を変化させる)必要があるためconstで宣言出来ません。 現在は"Ball& ball"と宣言をしていますが、これでは他クラス内でインスタンスの値を変更できてしまうため行儀が良いとは思えません。言っている事が矛盾しているとは思いますが、何とか"const Ball& ball"で宣言しつつBlockクラス内でボールの速度を変化させる方法は無いでしょうか? (2)ブロックとボールの衝突応答 ブロックとボールの衝突応答について、以下の様に記述しています。 void Block::reflect(Ball& ball){ Vector ballnext; ballnext.x=ball.getx()+ball.getVx(),ballnext.y=ball.gety()+ball.getVy(); if(fabsf(ballnext.x-this->x) <= this->width/2 && fabsf(ball.getx()-this->x) >= this->width/2){ ball.setVx(-ball.getVx()); } else if(fabsf(ballnext.y-this->y) <= this->height/2 && fabsf(ball.gety()-this->y) >= this->height/2){ ball.setVy(-ball.getVy()); } } この関数より前にブロック内にボールが含まれるかどうかの衝突判定を行っています。この関数では、数秒先のボールの位置がブロック内に含まれており、現在のボールの位置が含まれていない場合のそれぞれの位置関係で反射方向を決めています。 ですがこれでは上手く反射されません。ボールがブロックに接触し暫く突き進んだ後に反射されます。 しかし、 ballnext.x=ball.getx()+ball.getVx()*2,ballnext.y=ball.gety()+ball.getVy()*4; の様に記述すると上手く反射されます。何故こうなるのかが理解出来ません。 長文になってしまい申し訳ありませんが、どなたかご教授して頂けたら幸いでございます。

  • 本当にオブジェクト指向プログラミングっていいのでしょうか?

    いつもお世話になっております。 VC++初心者です。 現在、VC++6.0、MFCのソース修正で四苦八苦しています。 (コーディングするよりも。ソースを追うので苦労してます。) (初心者の私が言うのも難ですが、オブジェクト指向云々言う前に  ソースのif文節が異常に長かったり、3重以上ループが出てくると  とても嫌になります、、、) 一般的(?)に、プログラミングは 手続き型プログラミングよりオブジェクト指向プログラミングが 開発効率がよい、と重宝されているようですが、 どうも納得できていません。 (その手の書籍を2,3冊読みましたが消化不良に終わっています。) 個人的には、手続き型プログラミングの方が好きです。 というのも、慣れているからかもしれませんが、 ソースが追いやすいし、見やすいと思います。 逆にオブジェクト指向プログラミングでは、 ・継承されすぎると、基本クラスまで追うのが一苦労。 ・インスタンスをつくってから、関数を呼ぶのが面倒な気がする。  (手続き型なら関数呼び出しのみで済みます。) ・インスタンスをdeleteし忘れて、メモリを圧迫する危険がある。  (ガーベージコレクションというものもあるようですが、  どこで何を消しているか不安です。) ・ソースを追いにくい(慣れの問題なのでしょうか、、、) そこでですが、 「手続き型は~~で大変だけど、オブジェクト指向ならこんなにすばらしい」 というような対比的に具体例を挙げて説明されている 書籍、サイトの紹介、または、よい助言を頂けませんでしょうか。 また、上記に伴い、 ・手続き型で組んで失敗した例(オブジェクト指向型にすれば良かった例) ・オブジェクト指向型で組んで失敗した例(手続き型にすれば良かった例) も宜しければ教えて頂きたく、お願いします。 (成功例のみよりも、失敗からの成功例を教えて頂けると嬉しいです。) 長くなりましたが、宜しければご教授下さい。

  • オブジェクト指向コンパイラのインスタンスの構造について

    インタプリタやコンパイラの中身について興味があり勉強しています。といってもまだ簡単な字句解析や構文解析のレベルです。 読んだ本にはオブジェクト指向言語については書かれていませんでした、そこで一つ疑問に思ったこと点について質問させてください。 簡単な言語の場合、使用する変数が宣言されると、その領域がスタックやヒープ空間に確保されるという風に理解しました。 一方オブジェクト指向言語にて、あるクラスのインスタンスを生成した場合を考えます。インスタンスには変数の他に関数やメソッドといった処理手続きが含まれていますよね。その手続きをコンパイルしたコードは何処に置かれているのでしょうか? 手続きのコードもヒープ空間に確保された各インスタンスの領域にコピー(?)されて実行されるのでしょうか。それとも処理手続きの実体は実行プログラムに含まれていて全インスタンスで共通で利用するようになっているのでしょうか。 初心者の素朴な疑問です、ご回答いただければ幸いです。

  • 【C++】クラス内のメンバ関数の占める領域

    C++のことです(恐らく、他言語にも共通していると思いますが)。 例えば、 class a { void func(); }; という風なクラスがあったとして、これを a kurasu[100]; と言う風にインスタンスを生成した場合、メンバ関数funcも100個分作られるのでしょうか。 “関数が作られる”って言い方は適切でないかもしれませんが……。。。 100個分の関数用にメモリが割り当てられるのか、といったニュアンスです。 よろしくお願いします。

  • ゲームプログラミング クラス構造について

    現在、ソフトウェアエンジニアめざしてプログラミング勉強中の者です。 とりあえず、"The C Programing Language"(Kernighan&Ritchie) をようやく読み終え、最近C++の勉強を始めました。 そこで! 楽しくオブジェクト指向を身につけようと、簡単なゲームプログムを作りながら勉強する事にしたのですが、例えばマリオのような横スクロールアクションゲームの場合、どのようにオブジェクトを分類したら良いのでしょう? たとえば、どのような基底クラスを作り、そこからどのような派生クラスを作ったら良いのでしょうか? かんたんな構成の用な物を作っていただけるとうれしいです。 (例) キャラクター(X,Y座標が常に変化し動きまわる)  主役(ボタン操作によってX,Y座標が変化)   敵(プレイヤーのボタン操作とは関係なく動き回る) Action  重力(キャラクターX,Y座標にy方向加速度をくわえる)  MAP  床(重力によりキャラクターが下へ行き過ぎないようよう、Y座標の移動制限を制限)   ブロック 例は適当に作った物ですが、こんな感じにキャラクターのX,Y座標は重力などに対してPrivate:にするべきなのか?などもかいてあるとうれしいです^^