パスワードを忘れた? アカウント作成
15256986 journal
日記

yumeの日記: メデューサ・ゲーム改・9

日記 by yume

◉TurnManagerの改善
ターン中のイベントを動作種別に細分化した。
TurnManager
以前は3つのイベント(TurnStart、EvilSight、TurnEnd)で制御していたが、抜本的に変更した。
新たなターンイベントは以下の6つとなる。
(ターン開始時に実行)
・OnDetectPlayer //兵士などがプレイヤーを探知し、探知状態を切り替える。
・OnPathFind //兵士などが目的地への経路を探索し、必要なら移動する。
(ターン開始から0.2秒待って実行 = 移動とかは終えてから実行)
・OnEvilSightReflesh //邪眼の影響状態を更新する
・OnCapture //兵士の捕獲判定タイミング
・OnPetrify //兵士の石化判定タイミング
・OnSolveInputBuffer //プレイヤーの先行入力がある場合、ここでその入力が呼び出される。

これにより、処理の順は:
1. プレイヤーがターン消費行動を入力する(移動など)
2-1. 兵士がプレイヤーを探索し、発見状態を更新する
2-2-1. プレイヤーを発見した兵士は、経路を探索する。
2-2-2. 経路探索の結果を待ち、経路により移動先があるなら移動を開始する。
(TurnBaseTime(0.2秒)だけ待つ。移動のアニメーション時間分の待機)
3-1. 全員が移動したあとの座標での邪眼の影響範囲を更新する
3-2. 兵士が対象に触れているなら、捕獲を実行する
3-3. 兵士が邪眼の影響を確認し、石化ダメージを計算する。また、その結果石化する。
3-4. プレイヤーの先行入力があった場合、その入力で1.を実行する。
先行入力がない場合、入力を待ち、入力があったら1.を実行する。

ここまでに登場した処理のうち、経路探索〜兵士の移動は非同期処理になっている。
兵士の移動は経路探索を待ってから行われるが、0.2秒の待機の間に処理されるので、アニメーションが処理時間分遅れる可能性はあるものの、0.2秒以上ずれない限り、ゲームの結果には影響しない……と思う。
この辺りもちゃんとするなら、処理時間を計測して、兵士の移動アニメーション時間はTurnBaseTime - 処理時間としたらよいかな。
でも、処理時間が0.2秒を超えてしまったら、やっぱりおかしなことになるな。まぁ、現実的には計算時間が0.2秒を超えることは考えづらい……と思うけど、断言はできない(他のことでCPU使ったりとかもあるのかもしれないし)。
やっぱり2-2-1.の処理が終わるまでTurnManagerを待機させる必要がある? でもやり方がちょっと思い浮かばない。TurnManagerは経路探索者をリストで保持して、全員から何らかの通知を待つまで何もしないとか?

--

◉鏡
まぁとにかく要素を増やしていこう。最初の10レベルを構成するのには鏡が必須なので、これを作る。

鏡は邪眼を持ったEntityで、プレイヤーはインタラクトすると鏡を所持できる。
鏡を所持中に、何もない場所でまたインタラクトすると、鏡をそのマスに配置できる。

まずは「所持できる」という概念を作るために、ItemとInventoryの二つのクラスを作る。

抽象クラス Item は:
Touchableコンポーネントを持ち、
Interactorにインタラクトされたとき、
・Interactorの Inventory にItemクラスを保持させて、
・自身のGameObjectを非アクティブ状態にする。
・PlaceOnGroundメソッドを持つ。
・PlaceOnGroundメソッドの挙動は、継承先が実装する。基本的には、Itemを配置者の座標と同じ座標に移動し、GameObjectをアクティブにする。

クラス Inventory は:
・Itemをひとつだけ保持する
・ItemのPlaceOnGroundを呼び出せる。

そして、Itemクラスを継承してMirrorクラスを作る。

クラス Mirror : Item は:
・PlaceOnGround時、座標と共に配置者のFaceDirectionと自分のDirectionを合わせる。

Mirrorクラスを持つGameObjectは、邪眼の行使に必要なコンポーネントを持つ。

動作確認。

よさそうだ。

typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...