【3】アリクイあくしょんのコードの解説〜46〜110行目

JavaScript
たかまる
たかまる

このページでは、
・ステージのデータ作成
・ゲームの状態管理(ゲームオーバーなど)
について解説するね。
以下のコードがこのページで解説する部分だよ。

const stages = [
  { // ステージ1
    blocks: [
      { x: 0, y: 500, width: 1000, height: 200 },
      { x: 1100, y: 500, width: 1000, height: 200 },
      { x: 250, y: 380, width: 100, height: 40 },
      { x: 400, y: 300, width: 100, height: 40 },
      { x: 500, y: 150, width: 50, height: 40 },
    ],
    hiddenBlocks: [
      { x: 450, y: 200, width: 40, height: 40, visible: false },
      { x: 890, y: 400, width: 40, height: 40, visible: false },
      { x: 990, y: 350, width: 40, height: 40, visible: false },
    ],
    enemies: [
      { x: 600, y: 460, width: 40, height: 40, vx: 2, stopTimer: 0 },
      { x: 1200, y: 460, width: 40, height: 40, vx: -2, stopTimer: 0 }
    ],
    goal: { x: 1800, y: 440, width: 40, height: 60 }
  },
  { // ステージ2
    blocks: [
      { x: 0, y: 500, width: 800, height: 200 },
      { x: 900, y: 300, width: 300, height: 40 },
      { x: 1300, y: 200, width: 100, height: 40 },
      { x: 1500, y: 120, width: 200, height: 40 },
      { x: 1800, y: 400, width: 400, height: 100 },
    ],
    hiddenBlocks: [
      { x: 750, y: 400, width: 40, height: 40, visible: false }
    ],
    enemies: [
      { x: 1000, y: 260, width: 40, height: 40, vx: 2, stopTimer: 0 }
    ],
    goal: { x: 2100, y: 340, width: 40, height: 60 }
  },
  {  // ステージ3
    blocks: [
      { x: 0, y: 500, width: 300, height: 200 },
      { x: 400, y: 400, width: 100, height: 40 },
      { x: 600, y: 350, width: 100, height: 40 },
      { x: 800, y: 300, width: 100, height: 40 },
      { x: 1000, y: 400, width: 100, height: 40 },
      { x: 1200, y: 500, width: 400, height: 100 },
    ],
    hiddenBlocks: [
      { x: 900, y: 170, width: 40, height: 40, visible: false }
    ],
    enemies: [
      { x: 800, y: 260, width: 40, height: 40, vx: 2, stopTimer: 0 }
    ],
    goal: { x: 1500, y: 440, width: 40, height: 60 }
  }
];

let currentStage = 0;
let blocks = [];
let hiddenBlocks = [];
let enemies = [];
let goal = {};

// ゲーム状態フラグ
let gameStarted = false;
let gameCleared = false;
let gameOver = false;
イカクくん
イカクくん

やっとステージの作成だね!

たかまる
たかまる

といっても、あくまでデータの作成だから
まだ目には見えないんだ。
目に見えるようにする処理はまた今度。

足場のブロックを設置

    blocks: [
      { x: 0, y: 500, width: 1000, height: 200 },
      { x: 1100, y: 500, width: 1000, height: 200 },
      { x: 250, y: 380, width: 100, height: 40 },
      { x: 400, y: 300, width: 100, height: 40 },
      { x: 500, y: 150, width: 50, height: 40 },
    ],

{ }の中身が描画情報だよ。実はステージ1のブロックは5つしかないよ。(隠しブロックは除く)

まず、表示位置(x: 数字, y: 数字)を入力。

次に、width: 数字, height: 数字

ウィドゥスは幅、ハイトは高さ。

ブロックというと正方形をイメージしがちだけど、幅と高さを変えることができるよ。

隠しブロックの設置

hiddenBlocks: [
  { x: 450, y: 200, width: 40, height: 40, visible: false },
  { x: 890, y: 400, width: 40, height: 40, visible: false },
  { x: 990, y: 350, width: 40, height: 40, visible: false },
],

ここで登場するのがvisible: false

隠しブロックだから、最初は非表示にしてあるよ。

  • visible: true → 表示
  • visible: false → 非表示

敵キャラの設置

    enemies: [
      { x: 600, y: 460, width: 40, height: 40, vx: 2, stopTimer: 0 },
      { x: 1200, y: 460, width: 40, height: 40, vx: -2, stopTimer: 0 }
    ],

なぜ2行あるかというと、このステージでは敵を2体登場させたいから。

vx: 数字

vxは**「x方向の速度」**の意味。

つまり、敵キャラが横にどれだけ動くかのスピード。

2なら右方向に「2ピクセル/フレーム」くらいの速さで動くってこと。

stopTimer: 0

これは「止まっている時間」をカウントするタイマー。

たとえば敵が動いたり止まったりを繰り返す場合、止まっている間の時間を測るための変数。

今は0なので「止まってない」か「止まり始めたばかり」という状態。

イカクくん
イカクくん

数字が1だとどうなるの?

stopTimer: 01 になると、基本的には「敵が止まっている時間が1フレーム(または1単位)経過した」という意味になる。

具体的にはこんな感じ:

  • stopTimer は敵が停止している時間をカウントするタイマー
  • 0なら「止まってない、または止まり始めたばかり」
  • 1なら「止まってから1フレーム(あるいは1タイム単位)経過した」

ゲームの処理によっては、stopTimer の値が増えていき、ある一定時間止まったらまた動き出す、という制御に使われるよ。

たかまる
たかまる

このゲームの敵は、動いたり止まったりするように仕組んであるよ。

空箱を用意する

let currentStage = 0;
let blocks = [];
let hiddenBlocks = [];
let enemies = [];
let goal = {};

let currentStage = 0;
今のステージは「0」っていうこと。
ステージ1、ステージ2…とゲームが進んでいくとき、「今どのステージかな?」ってことを覚えておくんだよ。

let blocks = [];
let hiddenBlocks = [];
let enemies = [];
let goal = {};
今は中身が空っぽだけど、あとでデータが入るよ。

イカクくん
イカクくん

これから使う予定だから、準備してるだけってことだね!

ゲームの状態を管理する変数(箱)を作る

// ゲーム状態フラグ
let gameStarted = false;
let gameCleared = false;
let gameOver = false;

🔵 gameStarted

  • 意味:ゲームが始まったかどうか
  • 最初は false(始まってない)
  • スタートボタンを押したら true(始まった!)

🟢 gameCleared

  • 意味:ゴールしてゲームをクリアしたかどうか
  • ゴールにたどりついたら true になる!

🔴 gameOver

  • 意味:ゲームオーバーになったかどうか
  • 敵にぶつかったり、落ちちゃったら true になる!
イカクくん
イカクくん

これも好きな名前にしていいんだよね?
全部
let 好きな名前 = false;
なのに、どうしてそれぞれ動きが違うの?

たかまる
たかまる

今はまだ箱を作って名前をつけているだけなんだよ。
その名前ひとつひとつに、これから違う指示を出していくんだ。
例えば、gameStartedゲームが始まったかどうかを判断するのに使う予定ってこと。

イカクくん
イカクくん

そっか!
この解説の意味の部分は、後でそう動くようにする予定ってことなんだ。

たかまる
たかまる

うんうん。
んじゃ次はステージの切り替えを設定していくよ

コメント

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