私はエンティティシステムのアイデアにかなり慣れていません。たくさんのものを読んだことがあります(最も便利なのは、この素晴らしいブログとこの回答)。
未定義の数のソースによってオブジェクトの位置を操作できるほど単純なものを理解するのに少し問題があります。
つまり、私にはエンティティがあり、これには位置コンポーネントがあります。次に、このエンティティに、指定された時間内に指定された距離を移動するように指示するイベントをゲームで実行します。
これらのイベントはいつでも発生する可能性があり、位置と時間の値は異なります。その結果、それらは一緒に合成されます。
従来のOOソリューションでMoveBy
は、距離/時間を含むある種のクラスと、ゲームオブジェクトクラス内のそれらの配列がありました。各フレームではMoveBy
、すべてのを反復処理して、位置に適用します。がMoveBy
終了時間に達した場合は、アレイから削除します。
エンティティシステムでは、この種の動作をどのように再現するべきかについて少し混乱しています。
一度にこれらの1つだけがあった場合、それらを一緒に合成することができる代わりに、それはかなり単純で(私は信じます)、次のようになります。
PositionComponent
含む x, y
MoveByComponent
含む x, y, time
Entity
a PositionComponent
とaの両方があるMoveByComponent
MoveBySystem
これらのコンポーネントの両方を持つエンティティを探し、の値をMoveByComponent
に追加しますPositionComponent
。にtime
到達すると、そのエンティティからコンポーネントが削除されます。
多くの移動方法で同じことをどのように行うかについて、私は少し混乱しています。
私の最初の考えは、私が持っているだろうということです:
PositionComponent
、MoveByComponent
上記と同じ
MoveByCollectionComponent
MoveByComponent
sの配列が含まれています
MoveByCollectionSystem
これは、a PositionComponent
とa を持つエンティティを探し、その内部MoveByCollectionComponent
のMoveByComponent
sを繰り返し、必要に応じて適用/削除します。
これはより一般的な問題だと思います。同じコンポーネントの多くがあり、それぞれに対応するシステムが動作することを望んでいるからです。私のエンティティには、コンポーネントタイプ->コンポーネントのハッシュ内にコンポーネントが含まれているため、エンティティごとに特定のタイプのコンポーネントが1つだけ存在します。
これはこれを見るのに正しい方法ですか?
エンティティは常に特定のタイプのコンポーネントを1つだけ持つ必要がありますか?
move x by 10 in 2 seconds
してmove x by -10 in 2 seconds
、実体が完全にまだ立っているなら?
MoveBy
機能はまるでベロシティのような音ですね。順調に進んでいるようですね。2番目の質問については、エンティティ/コンポーネントシステムのさまざまな実装がたくさんあります。あなたがリンクした私の回答で説明されているものは、特定のタイプのコンポーネントを1つだけ持っています。