ゲームオブジェクトはどのようにお互いを認識する必要がありますか?
ゲームオブジェクトを多形であると同時に多形ではないように整理する方法を見つけるのは難しいと思います。 例は次のとおりです。すべてのオブジェクトにupdate()とが必要であると仮定しますdraw()。そのためには、GameObjectこれら2つの仮想純粋メソッドを持つ基本クラスを定義し、ポリモーフィズムを開始させる必要があります。 class World { private: std::vector<GameObject*> objects; public: // ... update() { for (auto& o : objects) o->update(); for (auto& o : objects) o->draw(window); } }; updateメソッドは、特定のクラスオブジェクトが更新する必要がある状態を処理することになっています。事実は、各オブジェクトが周囲の世界について知る必要があるということです。例えば: 鉱山は誰かが衝突しているかどうかを知る必要があります 兵士は、他のチームの兵士が近くにいるかどうかを知る必要があります ゾンビは、半径内で最も近い脳がどこにあるかを知っている必要があります 受動的相互作用(最初の相互作用のような)の場合、衝突検出は、衝突の特定のケースで何をすべきかをオブジェクト自体に委任できると考えていましたon_collide(GameObject*)。 他のほとんどの情報(他の2つの例のように)は、updateメソッドに渡されたゲームワールドによって照会できます。現在、世界はオブジェクトのタイプに基づいてオブジェクトを区別しません(すべてのオブジェクトを単一のポリモーフィックコンテナに格納します)。したがって、実際に理想的に返さworld.entities_in(center, radius)れるのはのコンテナですGameObject*。しかしもちろん、兵士は自分のチームから他の兵士を攻撃したくはありませんし、ゾンビは他のゾンビについては言いません。そのため、動作を区別する必要があります。解決策は次のとおりです。 void TeamASoldier::update(const World& world) { auto list = world.entities_in(position, eye_sight); for (const auto& e : list) …