window.addEventListener("keydown", (e) => {
if (e.code === "Space") {
startOrRestart();
}
});
// 画面クリック・タップ対応
canvas.addEventListener("click", startOrRestart);
canvas.addEventListener("touchstart", (e) => {
e.preventDefault();
startOrRestart();
});
// スペースキー or 画面クリック/タップでスタート&リスタート
function startOrRestart() {
if (!gameStarted) {
gameStarted = true;
gameOver = false;
update();
} else if (gameCleared || gameOver) {
currentStage = 0;
loadStage(currentStage);
gameCleared = false;
gameOver = false;
gameStarted = true;
update();
}
}
ゲーム開始ボタン
window.addEventListener("keydown", (e) => {
if (e.code === "Space") {
startOrRestart();
}
});

イベントリスナーは前に解説したからざっくりいくよ。

これなら僕わかるよ!
スペースキーを押したら、startOrRestartを実行
ってことでしょ?

その通り!
clickイベント、touchstartイベント
click → クリック、またはタップで発動
touchstart → タップで発動

それならclickイベントだけでいいんじゃないの?

実はclickイベントのタップにはこんな特徴があるんだ。
スマホやタブレットでの
clickは 少し遅れて(約300ms)発生します。
理由:ユーザーが「ダブルタップ」するかどうか待っているからです。そのため…
瞬時に反応させたい →
touchstartを使う方が快適

touchstartイベントはクリックには対応していないから、
PC・スマホ両方対応させたい場合は、両方設定するのがベスト!
(といっても0.3秒なんだけど、感じ方は人それぞれ。)
preventDefault(組み込み関数)
✅ 意味:ブラウザの「標準の動作」を止める
スマホやタブレットで指を使うと通常は
- スクロール
- ズーム
- ダブルタップ拡大
- テキスト選択 などが 自動で起こることがある。
- この
e.preventDefault();を入れることで、それらの標準動作をキャンセルして、
自分のゲームが正しく動くようにする。
startOrRestart を実装する

startOrRestartってなんやねん!
と、思っていた人がいたんではないだろうか?
function startOrRestart() {
if (!gameStarted) {
gameStarted = true;
gameOver = false;
update();
} else if (gameCleared || gameOver) {
currentStage = 0;
loadStage(currentStage);
gameCleared = false;
gameOver = false;
gameStarted = true;
update();
}
}

これから実装していくよ。
if (!gameStarted) {
まずこれで、もしgameStartedがfalseなら中身を実行ってことがわかるね。
gameStarted = true; gameOver = false; update();
- gameStartedをtrueにする。
- gameOverをfalseにする。
- updateはまだ未実装。次のページで実装。

いまいちよくわからないなあ。

それじゃあ過去に遡ってみよう。
let gameStarted = false; // 108行目 gameStartedを定義
function mainLoop() { // 350行目 ゲーム開始画面のループ再生
if (gameStarted) return; //もし、gameStartedがtrueなら中断
drawStartScreen();
requestAnimationFrame(mainLoop);
}
mainLoop();
function startOrRestart() { // 371行目 startOrRestartを定義
if (!gameStarted) { // もし、gameStartedがfalseなら中身を実行
gameStarted = true; // trueに変更
gameOver = false;
update();
}...

以前のコードを引っ張ってきたよ。
コメントアウトをよく読んでごらん。

そっか!
if (gameStarted) return; //もし、gameStartedがtrueなら中断
のトリガーになるのが、
gameStarted = true;
なんだね!

そうそう。
んじゃ次はelse ifの部分を見てみよう。
} else if (gameCleared || gameOver) {
currentStage = 0;
loadStage(currentStage);
gameCleared = false;
gameOver = false;
gameStarted = true;
update();
}
gameCleared || gameOver
|| は、「または」を意味する論理演算子(OR)
どちらか一方でも真(true)なら実行。
// 109行目 let gameCleared = false; let gameOver = false;

ちなみに最初はfalseに設定してあるよ。
これがtrueになるのは535行目だからまだ先だね。
else if まとめ
// gameStartedがtrueで、gameCleared か gameOver のどちらかがtrueなら実行
else if (gameCleared || gameOver) {
currentStage = 0; // ステージを最初(0)に戻す
loadStage(currentStage); // ステージ0のデータを読み込む
gameCleared = false;
gameOver = false;
gameStarted = true;
update();
}
}

このページはここまで。
次のページで
update();
を実装するよ!
コメント