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

完成するゲームのイメージはこんな感じです。
- プレイヤーが左右に移動できる
- ボタンを押すと弾が上に発射される
- 敵キャラが画面上部から落ちてくる
- 当たり判定あり!倒すとスコアが増える
たった128×64ピクセルの小さな画面なのに、ちゃんとゲームとして成立しているのがすごいですよね。OLEDディスプレイとボタン操作の基礎を学んだ次のステップとして、ピッタリなプロジェクトです。
用意するもの 🛠️
- ESP32開発ボード(DevKitC等)
- SSD1306対応 128×64 OLEDディスプレイ(I2C接続)
- プッシュボタン × 2
- 抵抗・ブレッドボード・ジャンパーワイヤー
- Arduino IDE(ESP32ボード設定済み)
ライブラリはAdafruit SSD1306とAdafruit 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選 ⚠️
- I2Cアドレスの確認:OLEDのアドレスは 0x3C か 0x3D が多いです。スケッチ内の
Adafruit_SSD1306 display(128, 64, &Wire, -1);のアドレスと一致させましょう - ボタンのチャタリング:プルアップ抵抗(INPUT_PULLUP)を使うと安定します
- 画面が真っ暗:
display.display()の呼び忘れが一番多い原因です
まとめ
ESP32とOLEDディスプレイを組み合わせれば、ミニシューティングゲームが驚くほど少ないコードで作れます。「むずかしそう」が「できそう」に変わったんじゃないでしょうか。🎉
ゲームループ・描画・当たり判定という概念は、他のゲームを作るときにもそのまま応用できます。ぜひブレッドボードに組んで、実際に遊んでみてください!次は敵の数を増やしたり、難易度を上げたりとカスタマイズも楽しめますよ 😊
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。







