エンティティまたはコンポーネントの状態変化


9

私のエンティティの状態管理を処理する方法を理解するのに問題があります。

一時停止やメニューなどのエンティティのコンポーネントシステムとして処理されないため、ゲームの状態管理に問題はありません。エンティティ/コンポーネントの状態のみ。

例としてOrcs Must Dieから描画すると、MainCharacterおよびTrapエンティティがあり、PositionComponent、RenderComponent、PhysicsComponentなどのコンポーネントしかありません。

エンティティは、更新ごとにそのコンポーネントでupdateを呼び出します。また、さまざまなイベントタイプのリスナーを備えた汎用のEventManagerもあります。

次に、トラップを配置できるようにする必要があります。最初にトラップとトラップの位置を選択し、次にトラップを配置します。

トラップを配置するときは、MainCharacterの前に表示され、別の方法でレンダリングされ、それに従って進みます。配置すると、衝突に反応し、通常の方法でレンダリングされます。

これは通常、コンポーネントベースのシステムでどのように処理されますか?

(この例は具体的ですが、エンティティの状態を処理する一般的な方法を理解するのに役立ちます。)


1
入力イベントに基づいてエンティティのコンポーネントを追加および削除できますか?おそらく、状態が変化したときにトラップのコンポーネントを変更できます。たとえば、トラップを配置している間は、FollowComponentとRenderEffectComponnentがあります。配置されたら、両方のコンポーネントを削除してCollisionComponentを追加します。(編集:Martin
Sojka

はい、できます。すべての入力は、「HumanView」からゲームイベントに変換されます。これらのほとんどは、最初にGameLogicクラスによって処理されます。たとえば、MainCharacterにトラップを配置するのに十分なお金があるかどうか、どのようにそれをチェックするかそれが私が理解しようとしていることの後で起こります。
GriffinHeart 2012年

回答:


6

コンポーネントシステムの興味深いアプリケーションの1つは、エンティティのコンポーネントを処理できるように設計した場合、実行時にエンティティのコンポーネントを変更できることです。したがって、エンティティの状態は、それに割り当てられているコンポーネントとそれらが保持している値の両方の合計になります。

あなたの例では、最初にa BuildControllerComponent(ビルドフェーズでのプレイヤーコントロールへの反応を管理する)、a PositionComponentおよびaでトラップを作成できますRenderComponent。最後の1つには、使用するピクセルシェーダーを制御する1つのデータフィールドがあり、そのうちの1つは、ビルドするトラップに「幽霊のような」外観を与えます。まだ物理コンポーネントが割り当てられていないことに気づくでしょう。

トラップを配置すると、コンポーネントが交換されます。BuildControllerComponentそれが削除されるので、もう必要ありません。RenderComponentシェーダは、トラップの通常の標準ビューに置き換えられます。最後に、PhysicsComponentトラップが機能するために必要な他のものがエンティティに追加されます。

継承ベースのアプローチでは、これは、引数としてActiveTrapEntityクラスを受け取るクラスのコンストラクターを持つことと同等BuildTimeTrapEntityであり、2番目のコンストラクターは、構築中にトラップをレンダリングするために使用され、最初のコンストラクターは、配置された後にトラップに使用されます。


これは賢いです。
サイファー、

1
これは、エンティティの状態を適用するための優れた戦略です。各エンティティの状態を追跡する方法の問題は扱いません。エンティティが現在どの状態にあるかをどのようにして知るのですか?
MichaelHouse

@MartinSojkaこれは私が質問した後に考えていたものに近づきます。トラップの構築に必要な状態の変更を実現するためにコンポーネントを変更する際の実行時の側面を管理するBuildTrapProcess(GameLogicで更新されるもの)を追加することを検討していました。トラップを作成するためのボタンが押されると、ゲームロジックがプロセスを作成して開始します。このアプローチについての考えは?
GriffinHeart 2012年

@ Byte56:通常、関連するコンポーネントとその値をクエリできます。実際には、多くの場合、状態全体の関連サブセットのみを知る必要があります。たとえば、「このエンティティは持っていBuildControllerComponentますか?」または「存在するPositionComponent場合、このエンティティのに記録されている位置は何ですか?」-関心のあるコンポーネントのコンポーネントリストを確認し、オプションでそれらの値(の一部)をクエリすることによって実行するもの。
Martin Sojka、

1
@GriffinHeart:の管理に関連するシステムでトラップを「構築」するために必要なものを実装するだけBuildControllerComponentです。プレイヤーキャラクター(またはカメラ)の視点の変更と、キーとマウスのプレスイベントを処理する必要があります。
Martin Sojka、

5

エンティティがコンポーネントの更新を呼び出すという考えは好きではありません(システムが機能しているはずです)。これは、コンポーネントが互いに気付かない状態を維持することで問題を引き起こします。

「状態」というコンポーネントを追加できます。レンダリングシステムと衝突システムからアクセスされます。状態コンポーネントは、複数の状態を利用できるフラグにすぎません。状況について説明すると、状態はとにPlayなりBuildます。レンダリングシステムが状態を確認Buildすると、オブジェクトを半透明に描画します。衝突システムがBuild状態を確認すると、プレーヤーとの衝突は処理されません。

しかし、実際には、システムがなく、すべての作業をコンポーネントに依存している場合、多くの問題が発生します。コンポーネントは相互に認識してはならず、処理を実行してはなりません。


あなたが言っていることは矛盾しています、まず彼らは気づかないはずです(私は同意します)、次にあなたは他の人がアクセスするコンポーネントを持っていることになります。明確にできますか?イベントシステムによってコンポーネントが分離されたままにします。
GriffinHeart 2012年

私は両方を言っています。私は彼らが気付かないべきであり、あなたがコンポーネントを処理していると私が思う方法への私の応答を調整しようとしていると言っています。「エンティティがそのコンポーネントの更新を呼び出す」と言うと、システム処理エンティティがないと思われます。紛らわしい言語を削除して、システムと言っています。それがあなたがアップデートしている方法であると理解していたので、私はコンポーネントと言っていました。
MichaelHouse

StateComponent複数のシステムで使用できるのアイデアが気に入っています。
サイファー、

1
反対票を投じるのは礼儀正しい。ありがとう。
MichaelHouse

2
別の見方をすれば、質問者のアプローチに対するあなたの反対は、すべてのコンポーネントベースの設計が、(エンティティシステム設計のような)別々のシステムからのコンポーネントを更新しなければならないという仮定に基づいています。これはそのための1つの方法ですが、確かに唯一の方法ではありません。また、キャッシュを最適化するコンポーネントの更新ループを必要としないゲームに対して、そのようなアプローチを止める理由はありません。
Sean Middleditch、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.