GameMaker 日本語掲示板

オブジェクト(struct)ベースのStateパターン / 8

9 コメント
views
17 フォロー
8
hayate212 2022/07/15 (金) 10:10:18

何に関心(AI,メニュー遷移,etc...)を持って実装をするかで大きく構造が変わるなと思い
オブジェクトの Sprite を管理するステートマシンを実装してみました

asa さんが最初に提示した実装例から以下のようなことを考えました

  • ステート内に遷移条件が実装されている
    • 開発が進むにつれステート内部が複雑になっていきそう
  • ステート内に挙動とアニメーション管理が実装されている
    • 前方への攻撃アニメーションを再生しつつ後退する場合、後退が行われた瞬間に攻撃アニメーションはキャンセルされる?
      • 場合によっては前方への攻撃アニメーションを残しつつ後退することも考えられるので、挙動=アニメーションではないはず
  • 新たにジャンプステートを実装する場合、ジャンプしながらの横移動処理はジャンプステートにも実装される?
    • 実装の重複は修正漏れ考えると避けたい・・・

そこでアニメーションの管理のみを行うステートマシンを実装しました。
以下が仕様です。

  • アニメーションステート(以下ステート)は Sprite を必ずひとつ持つ
  • 遷移条件構造体は遷移条件関数と遷移先のステート名を持つ
    • 遷移条件関数は遷移条件を満たしたかどうかの Bool 値を必ず返す
  • ステートをステートマシンに登録する際には以下の情報が必要
    • ステート名
    • ステート
    • 遷移条件構造体の配列
  • 毎ステップ、条件付きループ(for)で遷移条件構造体の配列の中から順番に遷移条件関数を実行し true が返った場合、遷移条件構造体の遷移先ステート名を元にステートを現在のものから置き換え、ループを抜ける
  • 毎ステップの最後に現在のステートから Sprite をオブジェクトに割り当てる

これにより挙動とアニメーション管理を分離出来ます。

*上記仕様をもとに実装しステートマシンを使用している部分
画像1

通報 ...