私は、多数の異なるエンティティを特徴とするゲーム環境に取り組んでいます。それぞれにいくつかの共通機能 (Draw、Update など) がありますが、ゲームは敵のタイプに基づいてそれらを異なる方法で処理する必要がある場合があります。これまでのところ、敵の「タイプ」をインスタンスのクラスにエンコードしました。したがって、次のような状況があります。
class MotionObject { ... };
class Entity : public MotionObject { ... };
class Coin : public Entity { ... };
class TextSign : public Entity { ... };
class ShapeEnemy : public Entity { ... };
class Attractor : public ShapeEnemy { ... };
class Bumper : public ShapeEnemy { ... };
したがって、クラス Coin、TextSign、Attractor、および Bumper は、ゲームでインスタンス化されるエンティティのタイプです。エンティティの種類ごとに異なるクラスを持つことは正しいと感じますが、「エンティティの種類」に基づいて動作を制御する switch ステートメントを含むエンティティ クラスが 1 つだけあれば、多少の煩わしさを回避できるかもしれないという感覚を揺るがすことはできません。変数に格納されたもの。プレーヤーは、タイプに応じてさまざまな方法でこれらのエンティティとやり取りします。動的キャストと null テストを毎回使用して、どの動作が適用されるかを判断します。明確にするために、これらは各エンティティで単純な Update() を呼び出すことができない動作のためのものです。プレーヤーは特定の方法で応答するか、エンティティ間の相互作用になります。これらはすべてエンティティ タイプに基づいています。私のコードは次のようになります。
void Game::Update(float deltaT) {
for (int i =0; i < DrawChildren.size(); i++) {
//each entity has its Update called
DrawChildren[i].Update(deltaT);
//What follows is code that the Game class needs to run based on the entity type.
Coin * coin = dynamic_cast<Coin*>(DrawChildren[i]);
if (coin != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}
TextSign * textSign = dynamic_cast<TextSign*>(DrawChildren[i]);
if (textSign != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}
Attractor * attractor = dynamic_cast<Attractor*>(DrawChildren[i]);
if (attractor != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}
Bumper * bumper = dynamic_cast<Bumper*>(DrawChildren[i]);
if (bumper != nullptr) {
...
continue; //so no other type's code executes, in case I have inherited types.
}
}
...
}
これを行うためのより面倒な方法はありますか?