クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

入力と状態機械

このレッスンのあとで: プレイヤーの状態を、状態機械として表せる。

60分のレッスンコマンド2件ゲーム開発ラボ:ブラウザーでゲームループ、重力、当たり判定を学ぶ

状態機械は場面の切り替えを決める

状態機械は、ゲームが今どの状態にいて、何が起きたら次にどの状態へ移るかを決める仕組みです。タイトル画面、プレイ中、一時停止のように、場面で動きが変わるゲームに使います。

これがないと、場面が増えるたびに 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つの状態の遷移表

今の状態きっかけ次の状態
titlestartplaying
playingpausepaused
playingdiegameover
pausedresumeplaying
gameoverrestartplaying

学生が入力するセルは、このプレビューでは空白です。

例: 表を引いて状態を進める

コード: web
<p id="out"></p>

よくある間違い

注意

どの状態でも、すべての入力が効くと考える人がいます。一時停止中に左キーで箱が動くなら、状態を見ていません。状態ごとに受け付ける入力を決め、受け付けない入力は無視します。

入力は押している間の印にする

ラボのゲームは、左右のキーを押している間、keys.left や keys.right を true にします。更新が毎フレームこの印を見て、箱を動かします。

入力を受け取る仕事と、入力で動かす仕事を分けると、一時停止中は印を見ない、という切り替えも簡単です。

キーを受け取る行を探す

コマンド
docker exec jupyter grep -n keydown game/game.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

このラボとソースについて: ゲーム開発ラボ:ブラウザーでゲームループ、重力、当たり判定を学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。