1匹のモグラを使ったシンプルなモグラたたきゲームを作成します
この基本編では1匹のモグラだけを扱い、配列などの複雑な概念は使いません。 プログラミング基礎を踏まえて実践的なコード作成を行い、 プログラミングが初めての方でも安心して次のステップに進める土台を築きます。
このチュートリアルでは、以下の基礎概念を使用します。まだ学習していない場合は、先に該当チャプターを確認することをお勧めします。
まず、ゲームで使用する画像ファイルを準備します。src/assets
フォルダに以下の画像を配置してください。
💡 画像について:
画像は自分で用意するか、フリー素材サイトからダウンロードしてください。 シンプルな図形でも構いません。重要なのはPhaserJSの使い方を学ぶことです!
src/scenes
フォルダにGameScene.ts
を作成します。
// src/scenes/GameScene.ts import * as Phaser from 'phaser'; export class GameScene extends Phaser.Scene { // モグラの穴の位置(画面の中央) private holeX: number = 400; private holeY: number = 300; // ゲームで使用するオブジェクトを格納する変数 private hole: Phaser.GameObjects.Image | null = null; private mole: Phaser.GameObjects.Image | null = null; // モグラの状態を管理する変数 private moleVisible: boolean = false; // タイマー関連の変数(deltaTime使用) private moleTimer: number = 0; // モグラ表示時間のカウンタ private spawnTimer: number = 0; // モグラ出現間隔のカウンタ private moleShowDuration: number = 3000; // モグラ表示時間(ミリ秒) private moleSpawnInterval: number = 2000; // モグラ出現間隔(ミリ秒) private hitShowDuration: number = 500; // やられ状態表示時間(ミリ秒) private moleHit: boolean = false; // モグラがやられた状態かどうか constructor() { super({ key: 'GameScene' }); } // ゲーム開始前にアセットを読み込む preload(): void { // 画像ファイルを読み込み this.load.image('hole', 'assets/hole.png'); this.load.image('mole', 'assets/mole.png'); this.load.image('mole_hit', 'assets/mole_hit.png'); } // シーンが開始されたときに実行 create(): void { // 背景色を設定 this.cameras.main.setBackgroundColor('#4ade80'); // 穴を画面に配置 this.hole = this.add.image(this.holeX, this.holeY, 'hole'); } // フレーム毎に実行される処理 update(time: number, delta: number): void { // モグラが表示されていない場合の出現タイマー if (!this.moleVisible) { this.spawnTimer += delta; if (this.spawnTimer >= this.moleSpawnInterval) { this.showMole(); this.spawnTimer = 0; } } else { // モグラが表示されている場合の非表示タイマー this.moleTimer += delta; const duration = this.moleHit ? this.hitShowDuration : this.moleShowDuration; if (this.moleTimer >= duration) { this.hideMole(); this.moleTimer = 0; } } } }
今回のゲームでは、デルタタイムを使用してタイマーを管理します。これにより、フレームレートに関係なく一定の時間で動作するゲームを作成できます。
this.time.delayedCall()
- コールバック関数での時間管理update()
メソッドで毎フレーム時間を累積して管理
update(time, delta)
メソッドのdelta
パラメータには、
前回のフレームからの経過時間(ミリ秒)が渡されます。これを累積することで正確な時間管理ができます。
GameScene.tsに以下のメソッドを追加します。
// GameScene.tsのcreate()メソッドの後に追加 // モグラを表示する private showMole(): void { // すでにモグラが表示されている場合は何もしない if (this.moleVisible) { return; } // モグラを作成して画面に表示 this.mole = this.add.image(this.holeX, this.holeY, 'mole'); // モグラをクリック可能にする this.mole.setInteractive(); // クリックされたときの処理を設定 this.mole.on('pointerdown', () => { this.hitMole(); }); // モグラが表示されている状態にする this.moleVisible = true; this.moleHit = false; this.moleTimer = 0; // タイマーをリセット } // モグラがクリックされたときの処理 private hitMole(): void { // モグラが表示されていない場合は何もしない if (!this.moleVisible || !this.mole) { return; } // 画像をやられた状態に変更 this.mole.setTexture('mole_hit'); // クリックを無効にする this.mole.disableInteractive(); // やられた状態にしてタイマーをリセット this.moleHit = true; this.moleTimer = 0; } // モグラを隠す private hideMole(): void { // モグラが存在する場合は削除 if (this.mole) { this.mole.destroy(); this.mole = null; } // モグラが隠れている状態にする this.moleVisible = false; this.moleHit = false; }
if (this.moleVisible)
で状態をチェック
null
(何もない)
Image オブジェクト
(画像)
null
(リセット)
this.add.image(this.holeX, this.holeY, 'mole')
src/main.ts
を以下のように更新します。
// src/main.ts import './style.css'; import * as Phaser from 'phaser'; import { GameScene } from './scenes/GameScene'; // ゲーム設定用の変数 const gameWidth: number = 800; const gameHeight: number = 600; const backgroundColor: string = '#4ade80'; // ゲーム設定 const config: Phaser.Types.Core.GameConfig = { type: Phaser.AUTO, width: gameWidth, height: gameHeight, parent: 'app', backgroundColor: backgroundColor, scene: [GameScene] }; // ゲームを開始 new Phaser.Game(config);
すべてのコードを保存したら、ターミナルで開発サーバーを起動します。
🐛 うまく動かない場合:
ブラウザのデベロッパーツール(F12)でエラーメッセージを確認してください。 よくある問題は画像ファイルのパスが間違っていることです。
変数の値を変更するだけで、ゲームの動作を簡単にカスタマイズできます。
// GameScene.tsで変数の値を変更してみよう export class GameScene extends Phaser.Scene { // モグラの出現位置を変更 private holeX: number = 200; // 左に移動 private holeY: number = 150; // 上に移動 // タイミングを調整する変数(デルタタイム使用) private moleTimer: number = 0; // モグラ表示タイマー private spawnTimer: number = 0; // モグラ出現タイマー private moleShowDuration: number = 2500; // 2.5秒で自動で隠す private moleSpawnInterval: number = 1500; // 1.5秒ごとに出現 private hitShowDuration: number = 800; // 0.8秒でやられ画像を表示 private moleHit: boolean = false; // やられ状態フラグ create(): void { this.cameras.main.setBackgroundColor('#4ade80'); this.hole = this.add.image(this.holeX, this.holeY, 'hole'); } // デルタタイムを使った時間管理 update(time: number, delta: number): void { if (!this.moleVisible) { // モグラが隠れている時:出現タイマーを進める this.spawnTimer += delta; if (this.spawnTimer >= this.moleSpawnInterval) { this.showMole(); this.spawnTimer = 0; } } else { // モグラが表示中:表示時間タイマーを進める this.moleTimer += delta; const duration = this.moleHit ? this.hitShowDuration : this.moleShowDuration; if (this.moleTimer >= duration) { this.hideMole(); this.moleTimer = 0; } } } private showMole(): void { if (this.moleVisible) return; this.mole = this.add.image(this.holeX, this.holeY, 'mole'); this.mole.setInteractive(); this.mole.on('pointerdown', () => this.hitMole()); this.moleVisible = true; this.moleHit = false; this.moleTimer = 0; // タイマーリセット } private hitMole(): void { private hitMole(): void { if (!this.moleVisible || !this.mole || this.moleHit) return; this.mole.setTexture('mole_hit'); this.mole.disableInteractive(); this.moleHit = true; this.moleTimer = 0; // やられ状態タイマーリセット } private hideMole(): void { if (this.mole) { this.mole.destroy(); this.mole = null; } this.moleVisible = false; this.moleHit = false;
この基本編では、変数の基本的な概念とPhaserJSの基礎を学習しました。 1匹のモグラを使ったシンプルなゲームを通じて、プログラミングの基本を身につけることができたはずです。
基本編をマスターしたら、発展編に挑戦しましょう! 配列を使った複数のモグラ管理や、より高度なプログラミング手法を学習できます。
基本的なゲームの作成ができるようになったら、次の章に進みましょう: