私はC++でゲームを作成しようとしています。 World
クラスには、すべてのゲーム状態関連オブジェクトとメインゲームループ機能が含まれています。ゲームパターンのメソッドを更新する引数
class World {
Clock clock;
Map map;
std::vector<Entity*> entities;
...
ゲームのすべてのエンティティは抽象クラスEntity
から継承されています。たとえば:
class Player: public Entity {...};
class Enemy: public Entity {...};
class Bullet: public Entity {...};
エンティティは、すべてのエンティティのリストを反復処理し、それぞれのupdate()
メソッドを呼び出すことによって、各フレームを更新しています。
さまざまなフレームレートを考慮に入れて、各フレームの経過時間をfloat delta
として(ほとんどの他のゲームエンジンのように)更新メソッドに渡します。私が遭遇する問題は、企業がupdate()
で参照する必要があるすべての異なるものです。次のように
Entity
クラスは、仮想updateメソッドを定義します。
for(int i = 0; i < entities.size(); i++) {
entities[i]->update(clock.get_delta());
}
これは素晴らしい作品:ゲームループからこの関数を呼び出す
virtual void update(float delta) = 0;
は次のようになります。しかし、例えば、Player
が異なるサーフェス上をより速く移動できるフィーチャを追加したいとしましょう。プレーヤーがどの面にいるのかを知るには、World
クラスに属するMap
オブジェクトにアクセスする必要があります。
我々は仮想updateメソッドにそれを追加することができます。
virtual void update(float delta, Map *map) = 0;
しかし、今Enemy
とBullet
の更新機能は、彼らがそれを使用していないにもかかわらず、新しいマップのパラメータを取らなければなりません。
エンティティがその更新メソッドで必要とする他のオブジェクトまたは変数に対しても同じことが行われます。まもなく、数多くのパラメータ(ゲームマップ、他のエンティティのリスト、ゲームの状態情報)がメソッド定義を混乱させます。
私の質問は次のとおりです。どうすればこの問題を防ぐことができますか?私は唯一の引数としてWorld
への参照を渡そうとしましたが、循環依存関係が生じました。
これは興味深い質問ですが、少し幅が広く、潜在的な解決策がたくさんあります。 http://gamedev.stackexchange.com/で運がよかったかもしれません。そこには[この質問](http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity)のようなゲームエンジンアーキテクチャの議論がたくさんあります。 - アーキテクチャ)。 – bejado
円順依存関係は、[フォワードクラス宣言](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration)で管理することができます – JGroven
[前方宣言?](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –