状態機械は場面の切り替えを決める
状態機械は、ゲームが今どの状態にいて、何が起きたら次にどの状態へ移るかを決める仕組みです。タイトル画面、プレイ中、一時停止のように、場面で動きが変わるゲームに使います。
これがないと、場面が増えるたびに if 文が絡まり、直すのが難しくなります。
このレッスンのゴール
メモ
プレイヤーの状態を、状態機械として表せる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 状態 | ゲームが今いる場面 | playing |
| イベント | 状態を変えるきっかけ | pause |
| 遷移 | ある状態から、別の状態へ移ること | |
| 状態遷移表 | 状態ときっかけから、次の状態を決める表 | |
| 入力 | キーやボタンの操作 |
学生が入力するセルは、このプレビューでは空白です。
ラボのゲームの状態は2つ
ラボのゲームには、状態が2つあります。遊んでいる状態と、ゲームオーバーの状態です。変数 gameOver が、今どちらかを覚えています。
gameOver が true のとき、更新は何もせず、描画は「Game over」と描きます。Space か Restart で newGame が呼ばれ、遊ぶ状態に戻ります。
gameOver が使われる場所を探す
grep -n gameOver は、gameOver を含む行を出します。ラボを変えていなければ6行出ます。変数を作る行、命が尽きて true にする行、更新と描画で見る行、Space で戻す行です。
gameOver の行を探す
docker exec jupyter grep -n gameOver game/game.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
状態が増えたら表にする
状態が増えると、if 文だけでは追えなくなります。そこで、状態ときっかけから次の状態を引く、状態遷移表を作ります。
下の表は、このレッスンの例です。ラボのゲームには、タイトルも一時停止もありません。表にない組み合わせは、無視して、状態を変えません。
例: 4つの状態の遷移表
| 今の状態 | きっかけ | 次の状態 |
|---|---|---|
| title | start | playing |
| playing | pause | paused |
| playing | die | gameover |
| paused | resume | playing |
| gameover | restart | playing |
学生が入力するセルは、このプレビューでは空白です。
例: 表を引いて状態を進める
<p id="out"></p>
よくある間違い
注意
どの状態でも、すべての入力が効くと考える人がいます。一時停止中に左キーで箱が動くなら、状態を見ていません。状態ごとに受け付ける入力を決め、受け付けない入力は無視します。
入力は押している間の印にする
ラボのゲームは、左右のキーを押している間、keys.left や keys.right を true にします。更新が毎フレームこの印を見て、箱を動かします。
入力を受け取る仕事と、入力で動かす仕事を分けると、一時停止中は印を見ない、という切り替えも簡単です。
キーを受け取る行を探す
docker exec jupyter grep -n keydown game/game.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。