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
Aボタンを押すと-X方向へ移動
Bボタンを押すとbulletをy方向へ発射
Cボタンを押すとX方向へ移動
Enemy bulletに当たると画面を初期化し画面に”Game over”とscoreの値を表示
Enemy
ランダムに出現し真っ直ぐ-y方向へ移動
弾を2秒に一回-y方向へ発射
Player bulletに当たると消える
Player bulletに当たるとscoreを➕1