M5stack~シューティングゲーム

 #include  <M5Stack.h>

// プレイヤー、敵、弾、スコアのパラメータ
int playerX = 160;  
int playerY = 200;  
int bulletX = -10;  
int bulletY = -10;
bool bulletFired = false;

int enemyX;
int enemyY = 0;
int enemyBulletX = -10;
int enemyBulletY = -10;
int score = 0;
bool gameOver = false;

// 敵と弾をランダムに生成
void spawnEnemy() {
  enemyX = random(10, 310);
  enemyY = 0;
}

// ゲームのリセット
void resetGame() {
  score = 0;
  playerX = 160;
  playerY = 200;
  bulletX = -10;
  bulletY = -10;
  enemyBulletX = -10;
  enemyBulletY = -10;
  bulletFired = false;
  gameOver = false;
  spawnEnemy();
}

// 初期設定
void setup() {
  M5.begin();
  M5.Lcd.fillScreen(BLACK);
  spawnEnemy();
}

// メインループ
void loop() {
  M5.update();
  
  if (!gameOver) {
    // プレイヤーの操作
    if (M5.BtnA.isPressed()) {
      playerX -= 10;  // 左へ移動
    }
    if (M5.BtnC.isPressed()) {
      playerX += 10;  // 右へ移動
    }
    if (M5.BtnB.wasPressed() && !bulletFired) {
      bulletX = playerX;
      bulletY = playerY - 10;
      bulletFired = true;
    }

    // 弾の移動
    if (bulletFired) {
      bulletY -= 10;
      if (bulletY < 0) {
        bulletFired = false;
      }
    }

    // 敵の移動
    enemyY += random(1, 3);  // 敵のランダムなY移動
    if (enemyY > 240) {
      spawnEnemy();  // 画面下に到達したら再生成
    }

    // 敵の弾の発射
    if (millis() % 2000 < 50 && enemyBulletY < 0) {  // 2秒に1回発射
      enemyBulletX = enemyX;
      enemyBulletY = enemyY;
    }
    if (enemyBulletY >= 0) {
      enemyBulletY += 8;
      if (enemyBulletY > 240) {
        enemyBulletY = -10;  // 画面外に出たらリセット
      }
    }

    // 弾と敵の衝突判定
    if (bulletFired && bulletX >= enemyX - 10 && bulletX <= enemyX + 10 && bulletY <= enemyY + 10) {
      score++;  // スコア加算
      spawnEnemy();
      bulletFired = false;  // 弾をリセット
    }

    // プレイヤーと敵、敵の弾の衝突判定
    if ((playerX >= enemyBulletX - 10 && playerX <= enemyBulletX + 10 && playerY <= enemyBulletY + 10) ||
        (playerX >= enemyX - 10 && playerX <= enemyX + 10 && playerY <= enemyY + 10)) {
      gameOver = true;  // ゲームオーバー
    }

    // 画面描画
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.fillRect(playerX - 10, playerY - 10, 20, 20, BLUE);  // プレイヤー
    M5.Lcd.fillRect(enemyX - 10, enemyY - 10, 20, 20, RED);     // 敵
    if (bulletFired) {
      M5.Lcd.fillRect(bulletX - 2, bulletY - 5, 5, 10, WHITE);  // プレイヤーの弾
    }
    if (enemyBulletY >= 0) {
      M5.Lcd.fillRect(enemyBulletX - 2, enemyBulletY - 5, 5, 10, YELLOW);  // 敵の弾
    }
    M5.Lcd.setCursor(10, 10);
    M5.Lcd.printf("Score: %d", score);

  } else {
    // ゲームオーバー画面
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(100, 100);
    M5.Lcd.setTextSize(3);
    M5.Lcd.setTextColor(RED);
    M5.Lcd.printf("Game Over");
    M5.Lcd.setCursor(100, 140);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.printf("Score: %d", score);

    if (M5.BtnA.wasPressed() || M5.BtnB.wasPressed() || M5.BtnC.wasPressed()) {
      resetGame();  // ボタンが押されたらリセット
    }
  }

  delay(50);  // フレームレート制御
}

コード解説

  • Player

    1. Aボタンを押すと-X方向へ移動

    2. Bボタンを押すとbulletをy方向へ発射

    3. Cボタンを押すとX方向へ移動

    4. Enemy bulletに当たると画面を初期化し画面に”Game over”とscoreの値を表示

  • Enemy

    1. ランダムに出現し真っ直ぐ-y方向へ移動

    2. 弾を2秒に一回-y方向へ発射

    3. Player bulletに当たると消える

    4. Player bulletに当たるとscoreを➕1


この記事が気に入ったらサポートをしてみませんか?