Arduino関連

ESP32 OLEDでミニシューティングゲームを作ろう!初心者向け完全チュートリアル

「ESP32って、IoTやセンサーだけじゃなくてゲームも作れるの?」そんな疑問を持ったことはありませんか?実は、128×64のOLEDディスプレイとプッシュボタン2つだけで、本格的なミニシューティングゲームが作れてしまうんです。今回は話題の「ESP32 OLED Mini Shooter Game」チュートリアルをベースに、日本語でわかりやすく解説していきます!🎮

このプロジェクトで何ができるの?

ESP32 OLED display game
ESP32 OLED display game / Photo by Bmonster Lab via Pexels

完成するゲームのイメージはこんな感じです。

  • プレイヤーが左右に移動できる
  • ボタンを押すと弾が上に発射される
  • 敵キャラが画面上部から落ちてくる
  • 当たり判定あり!倒すとスコアが増える

たった128×64ピクセルの小さな画面なのに、ちゃんとゲームとして成立しているのがすごいですよね。OLEDディスプレイとボタン操作の基礎を学んだ次のステップとして、ピッタリなプロジェクトです。

用意するもの 🛠️

  • ESP32開発ボード(DevKitC等)
  • SSD1306対応 128×64 OLEDディスプレイ(I2C接続)
  • プッシュボタン × 2
  • 抵抗・ブレッドボード・ジャンパーワイヤー
  • Arduino IDE(ESP32ボード設定済み)

ライブラリはAdafruit SSD1306Adafruit GFX Libraryを使います。Arduino IDEのライブラリマネージャーからインストールしておきましょう。確認を忘れずに! ✅

コアとなるゲームループの仕組み

ゲームの核心部分は「毎フレーム画面をクリアして描き直す」というシンプルな仕組みです。イメージとしては、パラパラ漫画をものすごい速さでめくっているような感じですね。

// ゲームのメインループ(簡略版)
void loop() {
  // ボタン入力を読み取る
  bool leftBtn  = !digitalRead(BTN_LEFT);
  bool rightBtn = !digitalRead(BTN_RIGHT);

  // プレイヤー移動
  if (leftBtn  && playerX > 0)      playerX -= 3;
  if (rightBtn && playerX < 116)    playerX += 3;

  // 弾の発射(左右同時押しで発射)
  if (leftBtn && rightBtn && !bulletActive) {
    bulletX      = playerX + 6;  // プレイヤーの中心から発射
    bulletY      = playerY - 4;
    bulletActive = true;
  }

  // 弾を上に移動
  if (bulletActive) {
    bulletY -= 4;
    if (bulletY < 0) bulletActive = false; // 画面外に出たら消す
  }

  // 敵を下に移動
  enemyY += enemySpeed;
  if (enemyY > 64) {
    // 画面外に出たらリセット
    enemyY = 0;
    enemyX = random(0, 120);
  }

  // 当たり判定
  if (bulletActive &&
      abs(bulletX - enemyX) < 8 &&
      abs(bulletY - enemyY) < 8) {
    score++;          // スコア加算
    bulletActive = false;
    enemyY = 0;
    enemyX = random(0, 120);
  }

  // 画面の描画
  display.clearDisplay();
  display.fillRect(playerX, playerY, 12, 6, WHITE);   // プレイヤー
  if (bulletActive)
    display.fillRect(bulletX, bulletY, 2, 4, WHITE);  // 弾
  display.fillCircle(enemyX, enemyY, 4, WHITE);       // 敵
  display.setCursor(0, 0);
  display.print("SCORE:");
  display.print(score);                               // スコア表示
  display.display(); // 実際に画面に反映

  delay(30); // 約33fps
}

ポイントをまとめるとこんな感じです 👇

  • display.clearDisplay() → 毎フレーム画面をリセット
  • display.display() → バッファの内容を実際に画面へ出力(これを忘れると何も映らない!)
  • 当たり判定は座標の差分(abs)でシンプルに実装
  • delay(30)で約33fpsのゲームスピードをコントロール

つまずきやすいポイント 3選 ⚠️


  1. I2Cアドレスの確認:OLEDのアドレスは 0x3C か 0x3D が多いです。スケッチ内の Adafruit_SSD1306 display(128, 64, &Wire, -1); のアドレスと一致させましょう
  2. ボタンのチャタリング:プルアップ抵抗(INPUT_PULLUP)を使うと安定します
  3. 画面が真っ暗display.display() の呼び忘れが一番多い原因です

まとめ

ESP32とOLEDディスプレイを組み合わせれば、ミニシューティングゲームが驚くほど少ないコードで作れます。「むずかしそう」が「できそう」に変わったんじゃないでしょうか。🎉

ゲームループ・描画・当たり判定という概念は、他のゲームを作るときにもそのまま応用できます。ぜひブレッドボードに組んで、実際に遊んでみてください!次は敵の数を増やしたり、難易度を上げたりとカスタマイズも楽しめますよ 😊

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です