有限状態機械で状態間を遷移し、状態を混合する方法は?


7

プレイヤーによって制御されるエンティティで有限状態マシンを使用する方法がわかりません。

たとえば、マリオスタイルのゲーム(2Dプラットフォーム)があります。私はジャンプしたり、走ったり、歩いたり、ダメージを与えたり、泳いだりすることができるので、最初に考えたのは、このアクションを状態として使用することでした。しかし、ダメージを受けたときに実行している場合はどうなりますか?それともジャンプ、ダメージを受け、同時に撃ちますか?

機能(アクション)をクリーンな方法でプレーヤーに追加したい(エンティティ更新のすべてのアクションに使用しない)。


2
質問はやや奇妙です。FSMでアクションが状態になるのなぜですか?FSMへの入力にならないのはなぜですか?

回答:


7

通常の方法は、複数のステートマシンを使用することです。このようにして、複雑な状態を処理する必要があるよりもはるかに簡単に多くの場合あなたの生活を簡単にする原子状態に固執することができます。

例えば:

  • ダメージモード:ノーマル、無敵(ちょうどヒットしたように)、無敵(スターを得たように)
  • ペース:ウォーキングモード、ランニングモード
  • 能力:ノーマル、スーパー、ファイア、フライ
  • ムーブメントタイプ:ウォーキング、水泳、飛行

オブジェクト指向設計では、これに適したパターンがあります。つまり、ステートマシンごとに1つのインターフェイスを持つことになります。そして、このインターフェースを実装する可能な状態ごとのクラス。

例を挙げます:インターフェイスDamageModeとサブクラスNormalDamageMode、InvulnerableDamageModeおよびInvincibleDamageModeがあります。プレーヤーが敵と衝突するたびに、メソッドDamageMode.collision(enemy)が呼び出されます。現在の状態を担当するクラスによって処理されます。

したがって、damageMode == NormalDamageModeの場合、プレーヤーは破損し、状態変数はInvulnerableDamageModeに設定されます。InvulnerableDamageModeでは何も起こらず、InvincibleDamageModeでは敵がダメージを受けます。もちろん、InvulnerableDamageModeとInvincibleDamageModeからNormalDamageModeに戻るにはタイマーが必要です。

if-elseif-elseif-elseif-blocksと比較した状態パターンの主な利点は、コードをより適切に構造化できることです。


1つの大きなファイルではなく、小さなFSMを多数作成するための+1。ここでは、粒状性が非常に役立ちます。
tenpn

複数の状態機械のアイデアが好きです。しかし、それらはエンティティと連携するためにどのように統合されますか?それらは並行して更新されますか?または、エンティティステートマシン内にネストされていますか?
ダニ

@Dani、各状態マシンはエンティティオブジェクトの属性として参照されます。それらのほとんどは独立している、例えば、あなたは小さい、超、火と飛ぶ能力で無敵になることができます。一部のイベントは複数の状態遷移をトリガーします。たとえば、敵にヒットすると、能力が低下し、ダメージモードが不死身に変わります。これにより、2つのステートマシンが実際にリンクされるケースはわずかです。たとえば、無敵の間に強制実行モード。
Hendrik Brummermann、2011年

7

状態はアクションではありません。ゲームでは、キャラクターの更新方法を制御します(たとえば、各状態は独自のupdate()関数を持つことができます)。

このページの図をご覧ください:http : //en.wikipedia.org/wiki/State_diagram。州は私たちに世界について何かを教えてくれます(ドアは開いているか閉じています)。アクションは、世界をある状態から別の状態に移行させるものを示しています。

あなたの場合、あなたは次のような状態を持つことができます:

  • ジャンピング
  • ランニング
  • 痛みで
  • 落下
  • デッド

また、状態間の遷移(イベント/状態間の矢印)は、プレーヤーの入力と次のような世界への反応になります。

  • モンスターに襲われた
  • ジャンプボタンが押されました
  • シュートボタンが押されました

各州は、関連するイベントが発生したかどうかを確認する必要があります。通常、これはifステートメントで行われます。

しかし、ダメージを受けたときに走っているときはどうなりますか?

hit by monsterイベントがトリガさにプレーヤーを移行することになるin pain状態。

ジャンプしてダメージを与えると同時にシュートする?

プレイヤーはin pain再び状態に移行します。この状態では、キャラクターが後方に落下することを示す「ヒット」スプライトを表示できます。

ifステートメントはおそらくエスケープしませんが、深くネストされたステートメントを回避できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.