私は、単一のスレッド化されたプログラミング言語 (Actionscript) でネストされた状態遷移を実装するための最良の方法に頭を悩ませようとしています。このビヘイビア ツリーのような構造があるとします。
ここで、各リーフ ノードが、ギャラリーの画像や、ページ ビューにネストされた投稿ビューにネストされたコメントのように、Web サイトの目的地であると想像してください...そして、目標は、リーフからアニメーション化されたトランジションを実行できるようにすることです。ノードからリーフ ノードへ、前のツリーを (下から上へ) アニメーション化し、現在のツリーで (上から下へ) アニメーション化します。
そのため、一番左下のリーフ ノードにいて、一番右下のリーフ ノードに移動したい場合は、次のようにする必要があります。
- 左下のノードから移行
- 完了すると (たとえば、アニメーションの 1 秒後)、親から移行します。
- 完了すると、その親から移行します
- 完了すると、一番右の親に遷移します
- 完了時、右端の子に遷移
- 完了時、リーフで遷移
私の質問は:
これらの各ノードを HTML ビュー (リーフは「部分」であり、レールから用語を借用したもの)、またはサブコンポーネントをネストしている MXML ビューとして想像すると、アプリケーションルート、上記のように遷移をアニメーション化する最良の方法は何ですか?
1 つの方法は、考えられるすべてのパスをグローバルに保存してから、「アプリケーション、このパスから遷移し、このパスに遷移します」と言うことです。アプリケーションが非常に単純な場合、これは機能します。これが、Actionscript フレームワークであるGaiaのやり方です。ただし、任意にネストされたパスに出入りできるようにしたい場合は、次の理由により、それをグローバルに保存できません。
- Actionscript はそのすべての処理を処理できませんでした
- 良いカプセル化のようには見えません
したがって、この質問は次のように言い換えることができます。どのように左端の葉のノードとその親を葉から開始し、右端の葉のノードでルートから開始してアニメーション化しますか? その情報はどこに保存されますか (何を移行するか)。
別の可能な解決策は、「アプリケーション、前の子ノードから移行し、それが完了したら、現在の子ノードに移行する」ということです。ここで、「子ノード」はアプリケーション ルートの直接の子です。次に、アプリケーション ルートの一番左の子 (2 つの子ノードがあり、それぞれに 2 つの子ノードがあります) は、正しい状態にあるかどうかを確認します (その子が「移行されている」場合)。そうでない場合は、それらに対して「transitionOut()」を呼び出します...そのようにして、すべてが完全にカプセル化されます。しかし、それはかなりプロセッサ集約的であるようです。
どう思いますか?他の代替手段はありますか?または、 AI Behavior Treesまたは Hierarchical State Machines で、非同期状態遷移を実際に実装する方法を説明している優れたリソースを教えてください。
- オブジェクトのどこから「transitionOut」を呼び出すのでしょうか? ルートまたは特定の子から?
- 状態はどこに保存されますか? グローバルに、ローカルに?「transitionIn()」と「transitionOut()」を呼び出すものを定義するスコープは何ですか?
私は AI とステート マシンに関する多くの記事/本を見たり読んだりしましたが、ビヘイビア ツリーに参加する数百のビュー/グラフィックスを含む複雑な MVC オブジェクト指向プロジェクトで非同期/アニメーション遷移を実際に実装する方法を説明するものをまだ見つけていません。
一番親のオブジェクトからトランジションを呼び出すべきですか、それとも子からトランジションを呼び出すべきですか?
ここに私が調べたもののいくつかがあります:
- ゲーム ビヘイビア AI のアーキテクチャ: ビヘイビア マルチキュー
- 階層ステート マシン — 基本的に重要な設計方法
- 例によるゲーム AI のプログラミング
- 目標主導のエージェントの行動
- トロイ・ガードナーによる高度な状態管理
- Troyworks の AS3 COGS ライブラリ
- ビヘイビア ツリー設計への一般的なアプローチ
- 非同期感覚システムのイベント駆動条件の構築
これは必ずしも AI の問題ではありませんが、ネストされた状態のアーキテクチャを Web サイトに適用する方法を説明する他のリソースはありません。これらは最も近いものです。
質問の別の言い方: 状態の変化をアプリケーションにどのようにブロードキャストしますか? イベントリスナーはどこに置いていますか? 任意にネストされている場合、アニメーション化するビューをどのように見つけますか?
注: 私はゲームを構築しようとしているのではなく、アニメーション化された Web サイトを構築しようとしているだけです。