学習目的で(後で一部のゲームで使用するため)コンポーネントベースのエンティティシステムを設計しようとしていますが、エンティティの状態の更新に関して問題が発生しています。
コンポーネント間の依存関係を防ぐために、コンポーネント内にupdate()メソッドを含めたくありません。
私が現在考えているのは、コンポーネントがデータを保持し、システムがコンポーネントを更新することです。
したがって、Transform、Movement、State、Animation、Renderingの各コンポーネントを持ついくつかのエンティティ(たとえば、player、enemy1、enemy2)を含む単純な2Dゲームがある場合、次のようにする必要があります。
- すべてのMovementコンポーネントを移動し、Stateコンポーネントを更新するMovementSystem
- また、アニメーションコンポーネントを更新するRenderSystem(アニメーションコンポーネントは、状態ごとに1つのアニメーション(つまり、フレーム/テクスチャのセット)を持つ必要があり、それを更新することは、現在の状態に対応するアニメーション(jumping、moving_leftなど)を選択することを意味します。フレームインデックスの更新)。次に、RenderSystemは、Renderコンポーネントを各エンティティのアニメーションの現在のフレームに対応するテクスチャで更新し、すべてを画面にレンダリングします。
Artemisフレームワークのようないくつかの実装を見てきましたが、この状況を解決する方法がわかりません。
私のゲームに次のエンティティがあるとします。各エンティティには、一連の状態と、状態ごとに1つのアニメーションがあります。
- プレーヤー:「アイドル」、「移動」、「ジャンプ」
- enemy1:「moving_up」、「moving_down」
- enemy2: "moving_left"、 "moving_right"
各エンティティの現在の状態を更新するために最も受け入れられているアプローチは何ですか?考えられる唯一のことは、エンティティのグループごとに個別のシステムを持ち、状態コンポーネントとアニメーションコンポーネントを個別に持つことです。そのため、PlayerState、PlayerAnimation、Enemy1State、Enemy1Animation ... PlayerMovementSystem、PlayerRenderingSystem ...がありますが、これは悪いことだと思いますソリューションとコンポーネントベースのシステムを持つ目的を壊します。
ご覧のように、私はここでかなり迷っていますので、どんな助けにも感謝します。
編集:私が意図したとおりにこの作業を行うための解決策はこれです:
すべてのエンティティに使用できるように、statecomponentとanimationcomponentを十分に汎用的にします。それらに含まれるデータは、再生されるアニメーションや使用可能な状態などを変更するための修飾子になります。–バイト56
今、私はこれらの2つのコンポーネントを再利用できるように十分に汎用的に設計する方法を理解しようとしています。各状態(ウォーキング、ランニングなど)のUIDを持ち、この識別子でキー設定されたAnimationComponentにマップ内のアニメーションを格納することは良いソリューションでしょうか?
statecomponent
とanimationcomponent
すべてのエンティティのために使用される一般的な十分。それらに含まれるデータは、再生されるアニメーションや使用可能な状態などを変更するための修飾子になります。