ページ 11

見降ろし2Dゲームの操作キャラの状態遷移

Posted: 2015年3月03日(火) 01:14
by Yv
はじめまして

最近ゲームプログラミングを始めたのですが,操作キャラクターの状態遷移の実装について皆様に聞いてみたいことがあります

ドラクエのような見おろしマップの上で,2Dスプライト(X,Y)で表示される自分・敵のキャラクターに動いてもらおうと思います.

まずは問題を簡単にするために,プレーヤーの移動だけを考えます。
プレーヤーは8方向に動くことができます.
キー入力がある間はその方向へ「歩き」,入力がない場合は直前まで歩いていた方向を向いて「静止」します
つまり,状態は16状態あることになります.

これを作ってくださいといわれたらみなさんはどのように考えるでしょうか?

簡単に実装したときは素直に整数値(enum)で16状態を用意し,
update()の中で「キー入力があった場合」はその方向に対応する「歩き状態」を求めて
現在の状態と違った場合は状態遷移,「キー入力がなかった場合」は現在の状態が「歩き」なら
その方向に対応する「静止」状態に遷移させました.キー入力と歩行状態が紐づけられたテーブルと,
同じ方向の歩きと静止を紐づけたテーブルを作っています.

整数値の代わりにStateパターンを適用することで「状態」および「遷移条件式」を拡張できますが
それでも16状態それぞれの条件式を書かなければならないので,もっと賢い方法はないでしょうか?
また,歩き→静止の遷移にしてもプレーヤーと敵で遷移条件式は異なりますから,その数だけStateを用意することになります.

この辺りの話でもしも考えられた経験がございましたらぜひ教えてください.

Re: 見降ろし2Dゲームの操作キャラの状態遷移

Posted: 2015年3月03日(火) 23:27
by softya(ソフト屋)
デザインパターンもそうですが、開発性やメンテ性を上げるのが目的ですので、やり過ぎると逆効果になります。
歩いていると言う状態と8の方向は別の情報変数に出来ます。
8つの方向も移動情報と歩きと静止のデータを持つ構造体配列を使えば添字番号で参照が出来ます。
添字番号はenumを使わずにconst intを使えばよいかと思います。如何でしょうか?