19

ゲーム開発における2つのオブジェクト間の衝突の状況に対して、優れたオブジェクト指向(OO)設計プラクティスを作成する方法を学びたいと思います。

SpaceShipクラスとMeteorクラスがあるとしましょう。MeteorがSpaceShipと衝突すると、SpaceShipは破壊されます。

質問:流星と宇宙船の間に衝突があるかどうかをチェックするメソッドと、衝突解決メソッド(宇宙船を破壊する)をどのクラスに配置する必要がありますか?SpaceShipクラスですか、それともMeteorクラスですか?または多分私は別のクラスに置くべきです、すなわち。GameAreaまたはGameControllerクラス?

注:簡単にするために、MeteorとSpaceShipが画像リソースの形式であると想定します。私はJava言語を使用することに慣れていますが、他の言語でも問題ありません。

4

4 に答える 4

15

衝突検出は、Spaceship や Meteor クラスに属さない責任であると考える方が自然です。特にこれが複雑になり、異なる方向に複数の衝突が発生する可能性がある場合。このロジックをこれらの両方のクラスに配置すると、周囲にある他の多くのオブジェクトへの参照が必要になりますが、これは適切ではありません。

ゲーム空間内のすべてのオブジェクトの座標を追跡し、衝突を検出するCollisionDetectorなどの別のクラスでこれを使用できます。私の意見では、衝突防止も別のクラスにあるはずの別の責任であるように思われます。これには、別のクラスCollisionResolverを使用できます。要件に応じて、CollisionDetectorはCollisionResolverと通信できます。

CollisionResolverは、向きを変えるようにアドバイスしたり、メテオに向けてミサイルを発射するように命令したりするなどの目的で、宇宙船と通信できる必要がある場合があります。

CollisionDetectorCollisionResolverは、 GameSpace /* GameController *内に配置できます。等..

これにより、単一責任の原則が促進され、各コンポーネントが 1 つの焦点を絞ったタスクのみを実行するようになります。

于 2012-07-04T21:56:22.037 に答える
3

私の意見では、衝突検出はオブジェクトの一部ではありません...別のものとして定義する必要があります-物理マネージャーなど。そうすれば、オブジェクトは衝突アルゴリズムに依存しなくなります。

もう 1 つのことは、ゲームでは通常、オブジェクトがいくつかのレイヤー (コンポーネント) で構成されていることです: グラフィック レイヤー、物理レイヤー、ロジック レイヤー。こうすることで、物理マネージャーは特定のオブジェクトの物理コンポーネントのみを管理します。

class GameObject 
{
    RenderComponent  m_renderComponent;
    LogicComponent   m_aiComponent;
    PhysicsComponent m_physicsComponent;
};
于 2012-04-11T08:05:05.390 に答える
1

まあ、私は通常GameObject、collides メソッドを持つ (ジェネリックの場合もある) クラスまたはインターフェイスを作成します。例えば:

template< typename T = int > class GameObject
{
public:
    bool collides(const GameObject& obj);
};

// usage
GameObject<int> my_obj, your_obj;
if(my_obj.collides(your_obj)) { ... };

私がときどき (しかしまれに) 行うもう 1 つのことは、別GamePhysicsのクラスを作成することです。

template< typename T > class GamePhysics
{
public:
    /* you may make this static or the class a singleton */
    void detect_collision(const T& obj, const T& obj2);
};
于 2012-04-11T04:54:10.720 に答える
1

Java (またはその他の OO 言語) では、ゲーム内のすべての移動オブジェクトの共通の祖先クラスにCollisionDetected コールバック/イベントを配置します。

これは、ゲームの簡単な説明です。

  • ゲームには通常、ゲームループがあります。ゲームループは、継続的に実行されるwhile(true)ループのようなもので (アプリケーションのメイン UI スレッドのようなものです)、すべてのステップで、オブジェクトで何が変更されたか、何を更新する必要があるか、どのイベントを呼び出す必要があるかをチェックします (もっと...)。

  • 応答性のために、このループは 1 秒間に何度も循環する必要があります。

  • このループ内で、物理エンジンオブジェクトはそのステータスを継続的に更新する必要があります。これは、独立したクラスのインスタンス オブジェクトになります。オブジェクト間の衝突を検出し、衝突したすべてのオブジェクトで CollisionDetected イベントを呼び出すのはこのエンジンです。

それはアイデアであり、決定的な解決策ではありません...

于 2012-07-04T23:18:35.490 に答える