いまどの状態か — FSM
点が「いま何をしているか」を一つの変数で持つ。追っているのか、散っているのか、逃げているのか。状態と、状態が切り替わる条件。これを表にしたのが有限状態機械、FSM。
有限状態機械(FSM, Finite State Machine)は、取りうる状態を有限個に決め、状態ごとの振る舞いと、状態から状態への遷移条件だけで動きを記述する仕組み。state という一個の変数と switch の分岐で書ける。同じ「次にどう動くか」の処理を、状態という一個の値で表情を変える。状態が N 個あると遷移は最大 N² 通りで、状態が増えるほど条件分岐が爆発する。それを木構造で宣言的に解くのがビヘイビアツリー。
状態をタイマーで回す。state は 0 が追う、1 が散る、2 が逃げる。timer を毎フレーム減らし、0 になったら次の状態へ送って再充填する。状態ごとに塗りを変えて、いまどれにいるかを色で出す。
帯が上から下へ巡る。濃く塗られた帯が、いまの状態。下の横棒がタイマーの残りで、0 まで縮むと次の帯へ移る。逃げる状態だけ充填が短いので、滞在時間が他より短い。状態は 0→1→2→0 の輪を回るだけで、まだ何にも触れていない。
この state を動きに繋ぐ。標的が一つあって、点はその標的に対して状態ごとに違う向き方をする。追うときは標的へ近づく方へ、散るときは無視して漂い、逃げるときは標的から離れる方へ。四方の進み先それぞれに、標的までの距離でスコアを付け、状態によってスコアの符号を反転させて、一番高い向きを選ぶ。
点が標的を追い、しばらくすると当てもなく散り、そのあと標的から逃げる。色がそのまま状態を表していて、state が切り替わる瞬間に向き方が裏返る。スコアを計算する処理は一つきりで、state === 0 ? -dist : dist の符号だけが追うと逃げるを分ける。散る状態はスコアをランダムにしているので、標的と無関係にうろつく。timer が状態の長さを決め、巡回する三状態を回し続ける。点が画面の隅に張り付いても、nx と ny が表示幅から決まるので右や下まで動ける。