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

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

日記 by yume

◉石化と捕獲。

で、兵士を構成する最後の要素「見られたら石化する」を実装する。

……の前に、邪眼の効果が発生するタイミングをちゃんと定義しよう。

ゲーム上で、邪眼が発動する瞬間は、今のところ毎フレームだが、実際に必要なタイミングは:
A. プレイヤーが向きを変えたとき(ターンは消費しないが、邪眼の状態が変わるため)
B. ターンが終了したとき。
C. 邪眼が通る条件が変わったとき(柱が動いたときなど)
の3点だろう。このうち、プレイヤーが向きを変えたタイミングは誰も検知していないので、これを検知する必要がありそうだ。

ん〜〜〜。レベルマネージャーのように、レベルごとに邪眼の管理者がいる方がやはりよさそうだな。
EvilSightManagerとしよう。

クラス EvilSightManager は:
・全てのSeeTargetをリストで保持する。
・プレイヤーが向きを変えるか、ターンが終了したとき、
・onRefleshEvilSightイベントと、onRefleshSeeTargetイベントを順番に発行する。

クラス EvilSight は:
・OnRefleshEvilSightイベントを購読し、
・イベントが発行されるとEvilSightを行使して、有効視界内の全てのSeeTargetの邪眼影響状態をOnにする。

クラス SeeTarget は:
・OnRefleshSeeTargetイベントを購読し、
・イベントが発行されると自身のSeeing状態を確認・更新する。

クラス PillarMechanism は:
・柱の状態が切り替わった1フレーム後に、EvilSightManagerに各イベント発行を要請する。
つまり、邪眼によって柱の状態が切り替わったなら、その結果邪眼の影響範囲も変わる可能性があるので、また邪眼の影響状態を再計算する、ということをしたい。
1フレームまたないとうまく動かないので1フレームさしこんでるが……あとでちゃんと検討しよう。

ん〜〜〜。同時に発生する時差イベントが多くなってちょっと怖い感じがするな。
ターン開始:全てのオブジェクトが自分の挙動を開始し、0.2秒数えてターン終了
ターン終了:全てのオブジェクトがターン終了時イベントを実行し、同時に邪眼状態を更新。柱が動いたなら1フレーム後に邪眼がさらに更新(それによって柱が動いたらまた更新を繰り返す)。

ターン開始からターン終了までは0.2秒あるので、大抵の処理は大丈夫だと思うけど、
ターン終了からターン開始まではタイムラグがゼロなので、ここで処理時間がかかることしちゃったら、下手すると予想外の挙動を起こしちゃうかもしれん。
ターン終了時イベントの処理を待機するみたいなことをしないといけないかも。ちょっとやり方がまだ思いつかないけど。

石化の判定は、ターン終了処理を終えたタイミングにしてみよう。
クラス Petrify は:
・SeeTargetを参照して、
・ターン終了時にSeeTargetが邪眼を検知している状態なら、石化状態を1進める。
・石化状態が設定した耐久力以上に達したら、石化したとみなす。

今のところ、OnTurnEnd(ターン終了時)というタイミングで視界の処理をしているので、ここに割り込むとまずい。なので邪眼の処理はOnTurnEndの手前にさらにOnTurnEndSightEventというSubjectを作り、ここに移動する。
処理の順番は:
OnTurnStart
(0.2秒後)
OnTurnEndSightEvent
(終了次第)
OnTurnEnd
となる。

ん〜〜〜。こんな調子で処理タイミング増えていきそうだな。それでもいいのか?
後々困りそうだから、TurnManagerに追加した処理をメモっておくか……。というか、メモる必要もないくらい自明な名前で必要なだけ処理タイミングイベントを増やした方がよいかも。

動作確認
うん、とりあえず動いてはいるな。
ただ、今のところ捕獲と石化が同じタイミングのイベントで処理されてるので、プレイヤーと石化直前の兵士が重なったとき、どちらが優先されるかがランダムになっている。これは要修正だな。

結果的に、TurnManagerは現状では3つのイベントを回してるけど、処理の種類ごとにイベントを増やして、それらを順番に発行した方がよいかもしれない。少なくとも、同時に起きると齟齬がありうるイベントは同時に起こしちゃいけないわけだ。
どれほど増やしたとしても、10個は超えなさそうだし。

  • by Anonymous Coward on 2021年04月12日 3時27分 (#4011214)

    ターン購読者に処理終了を報告させるようにするかな?
    あるいは発行前に準備終了を報告させるか。
    処理落ちしたときにどうするかもきちんと考えた方がいいかもしれない。

    ここに返信
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...