はじめに
こんにちは、@amekusa03です。
今回は、ESP32と16x2行のキャラクターLCDを使って、ブラウザ上のシミュレーター「Wokwi」で遊べるレトロなレーシングゲームを作成しました。
「たった2行の画面でレースゲーム?」と思われるかもしれませんが、速度に応じた遠心力の計算など、意外と熱い駆け引きが楽しめるように設計しています。
作ったもの
ESP32 Racing Game for Wokwi
16x2 LCDの限られた表示領域で、障害物(ガードレール)を避けながら1.5km先のゴールを目指すゲームです。
特徴
- 16x2 LCD: キャラクタディスプレイならではの制約の中で表現。
- 物理演算: コーナーでの「ドリフト」挙動を実装。
- コース自動生成: 直線やカーブがランダムに現れます。
- Wokwi対応: ブラウザ上ですぐにシミュレーション可能。
ハードウェア構成
Wokwiシミュレータ上で以下の構成を想定しています。
- MCU: ESP32 Development Board
-
Display: 16x2 I2C Character LCD (Address:
0x27) - Input: 2x3 マトリックスキーパッド
ピンアサイン
| デバイス | ピン | ESP32 GPIO |
|---|---|---|
| I2C LCD | SDA | GPIO 21 |
| SCL | GPIO 22 | |
| Keypad | Row 0-1 | GPIO 12, 13 |
| Col 0-2 | GPIO 33, 25, 26 |
ゲームの仕組みとこだわり
仕様書 (spec.md) に基づいて実装したゲームロジックのポイントを紹介します。
1. ゲームループ設計
ゲーム全体は 100ms (10FPS) 周期のステートマシンで動作させています。
LCDの書き換え速度やキースキャンの応答性を考慮し、このレートに設定しました。
-
STATE_IDLE: 待機・デモ画面 -
STATE_COUNTDOWN: スタート前のカウントダウン -
STATE_GAME: メインゲームループ -
STATE_GAMEOVER/STATE_GOAL: 終了判定
2. 「コーナリング」の物理計算
このゲームの最大のこだわりはコーナリング時の挙動です。
単に左右キーで曲がるだけではなく、速度超過でカーブに進入すると遠心力で外側に流される仕様にしました。
- 最高速度: 180.0 km/h
- コーナリング条件: 速度 > 60.0 km/h
カーブ走行時、以下の式で外側への力が働きます(100ms毎)
Corner = (Speed - 60.0) \times 0.02
例えば最高速(180km/h)でカーブに突っ込むと、2.4 ユニット分外側に流されます。車の最大移動幅が 15.0 程度なので、これは致命的です。
プレイヤーは 「アクセルを抜いて減速」するか、「早めにイン側へハンドルを切る」 というリアルな運転操作を求められます。
3. LCDへの描画
16x2の文字しか出せない画面で状況を伝えるため、カスタムキャラクターを活用しています。
-
/\: 直線のガードレール -
( || ): カーブのガードレール -
●: プレイヤーの車
車の位置は内部的には 0.0 ~ 15.0 の float で管理しており、これを四捨五入してLCDの16マスのどこに表示するかを決定しています。これにより、アナログな挙動とデジタルな表示を橋渡ししています。
4.操作方法
マトリックスキーパッドの5つのボタンを使用します。
- 青 (
8): アクセル - 赤 (
4) / 黒 (6): 左右ハンドル - 緑 (
7) / 黄 (9): ハンドル + アクセル同時押し - 壁(ガードレール)に接触すると速度ペナルティを受け、速度が 1.0 km/h を下回るとクラッシュ(ゲームオーバー)となります。
(PCのテンキーではありません)
まとめ
ESP32とLCDという基本的なパーツの組み合わせでも、内部ロジックを工夫することでアクション性のあるゲームを作ることができました。 Wokwiを使えば、物理的な配線をすることなくブラウザだけで・安全に・どこでも開発ができるので、皆さんもぜひオリジナルの電子工作ゲームを作ってみてください。
