編集:私の質問が正確に何であるかを明確にするために:これは、コンテンツの作成/管理に注目してゲームエンジンでアニメーション/アニメーション状態を処理する良い方法ですか?この方法で行うことの欠点は何ですか?また、それを行う別の方法は何ですか?-私の答えはコメントの中で部分的に答えられましたが、それが進むべき道のようです。
アニメーションをハードコーディングせずに、2Dゲームエンジンの趣味プロジェクトでアニメーションを処理しようとしています。アニメーションの状態をハードコーディングすることは、よくあることですが、非常に奇妙な現象のように思えます。
少しの背景:コンポーネントがデータの袋であり、サブシステムがそれらに作用するエンティティシステムを使用しています。ポーリングシステムを使用してアニメーションの状態を更新することにしました。
アニメーションを述べて私は意味: "walking_left"、 "running_left"、 "walking_right"、 "撮影"、...
アニメーションを処理する私のアイデアは、データ駆動型モデルとして設計することでした。データはxmlファイル、rdbmsなどに保存できます。また、ゲーム/レベル/の開始時にロードすることもできます。この方法で、コードをどこにでも変更することなく、アニメーションとトランジションを簡単に編集できます。ゲーム。
例として、念頭に置いたデータ定義の xmlドラフトを作成しました。
非常に重要なデータの1つは、単にアニメーションの説明です。アニメーションには一意のID(わかりやすい名前)が付けられます。画像への参照IDを保持します(異なるアニメーションは異なるスプライトシートを使用する可能性があるため、使用するスプライトシート)。アニメーションを実行する1秒あたりのフレーム。ここでの「リプレイ」は、アニメーションを1回または無限に実行する必要があるかどうかを定義します。次に、四角形のリストをフレームとして定義しました。
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
アニメーションデータは、アニメーションリソースプールに読み込まれて保持され、それを使用しているゲームエンティティによって参照されます。画像、音、テクスチャなどのリソースとして扱われます...
定義する2番目のデータは、アニメーションの状態と遷移を処理する状態マシンです。これは、ゲームエンティティが存在できる各状態、移行できる状態、およびその状態の変化をトリガーするものを定義します。
この状態マシンは、エンティティごとに異なります。鳥には「歩く」と「飛ぶ」という状態があるかもしれませんが、人間には「歩く」という状態しかありません。ただし、複数の人間がおそらく同じ状態になる可能性があるため(特に、モンスターなどの一般的なNPCを定義する場合)、異なるエンティティで共有できます。また、オークは人間と同じ状態になる場合があります。この状態定義は、ゲームエンティティの選択グループによってのみ共有される可能性があることを示すためだけです。
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
ポーリングシステムでこれらの状態を扱うことができます。各ゲームティックは、ゲームエンティティの現在の状態を取得し、すべてのトリガーをチェックします。条件が満たされると、エンティティの状態が「goto」状態に変更されます。
最後に苦労したのは、アニメーションデータとアニメーション状態をエンティティにバインドする方法でした。最も論理的なアプローチは、エンティティが使用するステートマシンデータへのポインタを追加し、そのマシンの各ステートに使用するアニメーションを定義するように思えました。
アニメーションの状態とアニメーションデータIDを指定することにより、ゲーム内の一般的なエンティティのアニメーション動作とグラフィック表現を定義する方法のxmlの例を次に示します。「ウィザード」と「オーク」の両方のアニメーションの状態は同じですが、アニメーションが異なることに注意してください。また、異なるアニメーションは、異なるスプライトシート、またはアニメーションの異なるシーケンスでさえも意味する可能性があります(アニメーションはより長くも短くもなります)。
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
エンティティが作成されると、ステートマシンデータとアニメーションデータ参照を含むステートのリストが追加されます。
将来、エンティティシステムを使用して、同様のxml形式でコンポーネントを定義することでエンティティ全体を構築します。
-
これは私がいくつかの研究の後に思いついたことです。しかし、頭を悩ませているので、フィードバックを期待していました。意味をなさないものがここにありますか、またはこれらを処理するより良い方法がありますか?私はフレームを反復処理するというアイデアを理解しましたが、それをさらに一歩進めるのに苦労しており、これが私の試みです。