私は卓球ゲームを書いていて、速度x、y、位置、および@ball.updateを呼び出すことによってすべてのフレームが更新されるすべてのものを持つボールクラスを持っています。これは、x_velとY_velなどによってボールを前方に動かします。質問は、衝突コードをボール クラスのループまたは update メソッドに配置する必要があるかどうかです。それとも、すべてがループ内にあり、ボールがその位置を制御できないようにする必要がありますか?
3 に答える
ゲーム内の他のすべてのオブジェクトの知識が必要になるため、ボール クラスでは衝突検出を行うべきではありません。
多くのオブジェクトを持つシューティングゲームを想像して、各オブジェクトが独自に衝突を計算しようとするとどうなるかを考えてみてください。
衝突検出を気にする専用のクラスが必要です。このクラスは、その監視対象オブジェクトのいずれかがその位置を変更した場合に通知されます。次に、衝突をチェックし、衝突があるすべての abject (2 :) だけでなく通知します。
楽しむ... :)
あなたが説明したような Ball クラスは確かに良い考えです。そうすれば、いくつかの「ブレイクアウト」ゲームのように、2 つ以上のボールをスポーンしたい場合や、そのコードを別のゲームで再利用したい場合に、それを複製できます。同様の X、Y 座標を持つ Paddle クラスを作成することもできます (または、Ball と Paddle がそのような類似のメンバーを多数共有していることが判明した場合は、「ScreenObject」クラスから両方を派生させます)。パドルは、ユーザー入力を受け取るスレッド/イベントによって更新される共有変数を読み取ることができます。
壁などに対する単純な衝突は、画面の寸法範囲などのグローバルにアクセス可能な値に基づいて、Ball クラスで実行できます。Update ルーチンは、特定の壁にぶつかったときに、1 つの速度コンポーネントを単純に逆にすることができます。Ball クラスでデリゲート/コールバックを定義および設定して、ボールがバウンドしたときにサウンドを再生できます。同様に、Paddle's Update は画面サイズをチェックできるため、パドルを画面外に移動することはできません。
TottiW が推奨するように、オブジェクト間の衝突は、すべてのオブジェクトを所有するか、X、Y メンバーまたはバウンディング ボックスにアクセスできる親「マネージャー」クラスで行うのが最適です。これは優れたオブジェクト指向設計です。ボールとパドルは、互いの X、Y 位置にアクセスできません。...しかし、マネージャーはそうします。また、冗長な衝突チェックを排除することもできます。オブジェクト A がオブジェクト B との衝突をチェックする場合、B はその後 A との衝突をチェックする必要はありません。したがって、実際にマネージャ クラスで行う必要があるのは、各パドルについて、各ボールの位置をチェックすることだけです。パドルは、固定された Y 位置で一方向、つまり水平方向にのみ移動する可能性があるため、これはさらに単純化できます。したがって、単純な例として、最初のチェックで Ball.Y < Paddle.Y をすぐに排除できます (Y の方向によって異なります)。
多数のオブジェクトを含むゲームでは、すべてのオブジェクトを衝突検出するのではなく、最も近いものだけを衝突検出したいと考えています。その場合、「マネージャー」は、X 方向と Y 方向の両方でオブジェクトのリンク リストを保持する「シーン マネージャー」のようなものになります。オブジェクトが他のオブジェクトを通過すると、リスト内のポインターが交換されるため、リストは常にソートされたままになります。そうすれば、特定のオブジェクトについて、左/右/上/下のオブジェクトがすぐにわかるので、それらに対して衝突チェックを行うだけで済みます...多くの時間を節約し、ゲームを最大速度で実行します. しかし、あなたはまだこの段階に達していないかもしれません!
頑張って、他の人が言ったように、楽しんでください!
pong の場合、単純な行列演算で十分です。ball クラスが 1 つしかなく、タプルを保持するためだけに使用する場合は必要ありません。