レッスン5: 最終プロジェクト - ブロック崩しゲーム

🎯 このレッスンで学ぶこと

🎮 完成版のブロック崩しゲーム

マウスでパドルを操作、クリックでゲームスタート!

📝 コードの構造

1. ゲームの状態管理

// ゲームの状態
let gameState = 'START';  // START, PLAYING, GAMEOVER, CLEAR

function draw() {
    if (gameState === 'START') {
        drawStartScreen();
    } else if (gameState === 'PLAYING') {
        updateGame();
        drawGame();
    } else if (gameState === 'GAMEOVER') {
        drawGameOver();
    }
}

2. オブジェクトの管理

// ブロックを配列で管理
let blocks = [];

// ブロックの初期化
for (let row = 0; row < blockRows; row++) {
    for (let col = 0; col < blockCols; col++) {
        blocks.push({
            x: col * (blockWidth + 10) + 35,
            y: row * (blockHeight + 10) + 50,
            visible: true,
            color: color(row * 60, 80, 100)
        });
    }
}

3. 衝突判定

// 矩形同士の衝突判定
if (ballX > block.x && ballX < block.x + blockWidth &&
    ballY > block.y && ballY < block.y + blockHeight) {
    // 衝突した!
}
💡 ゲーム作りのポイント:
  • 状態管理を明確にする(メニュー、プレイ中、ゲームオーバーなど)
  • オブジェクトは配列やオブジェクトで管理
  • 関数を適切に分割して読みやすくする
  • 定数は変数として定義しておく(調整しやすい)

🚀 改良のアイデア

🎨 ビジュアル改善

  • パーティクルエフェクト
  • グラデーション背景
  • ブロック破壊アニメーション
  • トレイル効果

🎮 ゲームプレイ改善

  • パワーアップアイテム
  • 複数のボール
  • 特殊ブロック
  • 難易度調整

🔊 サウンド追加

  • 効果音(p5.sound使用)
  • BGM
  • 衝突時の音
  • クリア音

💾 データ保存

  • ハイスコア記録
  • ステージ選択
  • 実績システム
  • 統計表示

📚 プロジェクトテンプレート

// === グローバル変数 ===
let gameState = 'MENU';
let player;
let enemies = [];
let score = 0;

// === セットアップ ===
function setup() {
    createCanvas(800, 600);
    initGame();
}

// === メインループ ===
function draw() {
    updateState();
    render();
}

// === 状態更新 ===
function updateState() {
    switch(gameState) {
        case 'MENU':
            updateMenu();
            break;
        case 'PLAYING':
            updatePlayer();
            updateEnemies();
            checkCollisions();
            break;
        case 'GAMEOVER':
            updateGameOver();
            break;
    }
}

// === 描画 ===
function render() {
    background(0);

    switch(gameState) {
        case 'MENU':
            drawMenu();
            break;
        case 'PLAYING':
            drawPlayer();
            drawEnemies();
            drawUI();
            break;
        case 'GAMEOVER':
            drawGameOver();
            break;
    }
}

// === 初期化 ===
function initGame() {
    player = {
        x: width / 2,
        y: height - 50,
        size: 30,
        speed: 5
    };

    enemies = [];
    score = 0;
}

// === イベントハンドラ ===
function keyPressed() {
    // キー入力処理
}

function mousePressed() {
    // マウスクリック処理
}

🎯 自分だけのゲームを作ろう!

アイデア集

🎉 おめでとうございます!
これでp5.jsの基本的な使い方をマスターしました!

学んだこと:
  • ✅ p5.jsの基本構造(setup/draw)
  • ✅ 図形の描画と色の設定
  • ✅ アニメーションの作成
  • ✅ マウスとキーボードのインタラクション
  • ✅ ゲームロジックの実装

次のステップ:
  • p5.soundライブラリで音を追加
  • 3D描画(WEBGL)に挑戦
  • 外部データ(JSON、CSV)の読み込み
  • より複雑なアルゴリズムの実装

📖 参考リソース