phaserでゲーム開発 第七回

に公開

phaserでゲーム開発シリーズ、第七回。
前回の記事はこちら。
https://zenn.dev/k_tabuchi/articles/db2fa34b1bbb99

この記事では、複数の敵を出す処理について解説します。
https://youtu.be/H7MIMyPVW9A

Phaserで複数の敵キャラを出現させる方法

今回の実装では、一定時間ごとに敵キャラを生成し、同時に出現できる数に上限を設定する仕組みを組み込みました。これにより、ゲーム進行に応じて敵が増えていく緊張感を演出できます。


敵キャラを管理するグループの用意

敵をまとめて管理するために、create() 内で Physics Group を生成します。

this.#enemys = this.physics.add.group();

このグループに新しい敵キャラを追加していくことで、後からまとめて動作や当たり判定を管理できます 。


タイマーイベントで定期的に生成

Phaser の time.addEvent を利用し、2秒ごとに敵キャラを生成するよう設定しました。

this.time.addEvent({
  delay: 2000,              // 2秒ごと
  callback: this.spawnEnemy,
  callbackScope: this,      // this を GameScene に固定
  loop: true,               // 繰り返し実行
});

この仕組みのおかげで、ゲーム中に自動的に敵が増えていきます。


出現数の上限を決める

出現数が無限に増えると処理が重くなるため、最大5体までという制限を入れています。

const maxEnemies = 5;

if (this.#enemys.countActive(true) >= maxEnemies) {
  return; // 5体以上なら生成しない
}

敵キャラの生成処理

実際に敵を生成する処理は spawnEnemy() にまとめています。

const x = Phaser.Math.Between(100, 700); // ランダムなX座標
const y = 50;                            // 上から落ちてくる
const enemy = this.#enemys.create(x, y, "enemy");

// 当たり判定を調整
enemy.body.setSize(30, 30).setOffset(1, 1);

// 物理的な特性を設定
enemy.setCollideWorldBounds(true);
enemy.setBounce(0.2);
enemy.setVelocity(Phaser.Math.Between(-100, 100), 20);

// プレイヤーや地形との衝突を有効化
this.physics.add.collider(enemy, this.#layer);
this.physics.add.collider(enemy, this.#player);

ここで行っているのは以下の3点です。

  • 位置のランダム化:出現位置を毎回変えることでゲーム性を向上。
  • 物理挙動の設定:跳ね返りや速度を調整して自然な動きを演出。
  • 衝突判定の追加:プレイヤーや地形としっかり干渉するようにする。

敵の行動パターン

update() 内では、一定の確率で敵の移動方向を変える処理を入れています。

this.#enemys.children.iterate((enemy) => {
  if (!enemy) return;

  if (Phaser.Math.Between(0, 100) < 2) {
    const speed = 100;
    const dir = Phaser.Math.Between(0, 1);
    switch (dir) {
      case 0:
        enemy.setVelocity(speed, 0);
        enemy.anims.play("enemy-walk-right", true);
        break;
      case 1:
        enemy.setVelocity(-speed, 0);
        enemy.anims.play("enemy-walk-left", true);
        break;
    }
  }
});
  • ランダム要素を入れることで、同じ動きの繰り返しにならず変化が生まれます。
  • 今回は「2% の確率で方向転換」としています。

まとめ

今回の実装で学べるポイントは次の通りです。

  • グループ管理で複数の敵キャラを扱いやすくする
  • タイマーイベントで敵を定期的に追加する
  • 最大数を制限して処理の安定性を確保
  • ランダム挙動で単調さを回避

これらを組み合わせることで、シンプルながらもゲームらしい「複数の敵が迫ってくる」体験を作ることができます。


株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion