【11】アリクイあくしょんコード解説 357行目〜

JavaScript
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();
を実装するよ!

コメント

タイトルとURLをコピーしました