Создание игры ESP Bird на OLED-дисплее SSD1306 и ESP32

Создание игры ESP Bird на OLED-дисплее SSD1306 и ESP32

Пошаговое руководство по созданию клона Flappy Bird — ESP Bird — на микроконтроллере ESP32-S3 SuperMini и OLED-дисплее 128x64. Физика, графика и код игры.

Проекты

Вернуться в блог

Превращаем связку ESP32 и OLED-дисплея в полноценную игровую консоль! В этом уроке мы создадим ESP Bird — клон знаменитой игры Flappy Bird, оптимизированный для работы на монохромном экране 128x64.

Игра ESP Bird на OLED дисплее

В предыдущей статье мы научились подключать OLED-дисплей SSD1306 к ESP32-S3 и работать с кнопкой. Теперь мы используем эти знания для создания динамичной игры.

Железо

Необходимые детали

Схема подключения остается прежней. Нам важны три компонента:

1

ESP32 S3 SuperMini

Компактный и мощный контроллер. Подойдет и любая другая плата ESP32.

ESP32-S3 SuperMini
2

OLED SSD1306

Дисплей 128x64 пикселей с интерфейсом I2C.

SSD1306 OLED

Также понадобится обычная тактильная кнопка (12x12 мм или 6x6 мм) для управления прыжком.

Геймдизайн

Разбор игровой механики

ESP Bird — это упрощенная версия Flappy Bird. Основные элементы:

  • Гравитация: Птица постоянно падает вниз.
  • Прыжок: Нажатие кнопки придает птице импульс вверх.
  • Препятствия: Вертикальные трубы с проемами случайной высоты, движущиеся справа налево.
  • Коллизии: Проверка столкновения птицы с трубами, небом или землей.
Экран Game Over

Экран окончания игры с отображением текущего и лучшего счета

Графика

Графика и рендеринг

Даже на OLED 128x64 можно добиться плавной картинки:

  1. Спрайты: Птица рисуется как битмап 16x16. У нее есть два кадра анимации для имитации взмахов крыльев.
  2. Трубы: Отрисовываются как закрашенные прямоугольники.
  3. Частота кадров: Игра работает со скоростью около 20 FPS, что достаточно для комфортного управления.
Схема отрисовки игры
Код

Полный код игры

Ниже представлен полный скетч для Arduino IDE. Код использует библиотеки Adafruit_GFX и Adafruit_SSD1306.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Размер спрайта
#define BIRD_SIZE 16
// Пины I2C для SuperMini
#define I2C_SDA 13
#define I2C_SCL 12
#define BUTTON_PIN 11

Adafruit_SSD1306 oled(128, 64, &Wire, -1);

// Кадры анимации птицы
static const unsigned char PROGMEM bird_frame1[] = { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x1F, 0xE0, 0x3C, 0xF0, 0x7F, 0xF8, 0xFF, 0xE4, 0xDF, 0x78, 0xDF, 0x78, 0xDF, 0x78, 0xCE, 0x78, 0x71, 0xF0, 0x7F, 0xE0, 0x3F, 0xC0, 0x07, 0x00, 0x00, 0x00 };
static const unsigned char PROGMEM bird_frame2[] = { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x1F, 0xE0, 0x3C, 0xF0, 0x7F, 0xF8, 0xF1, 0xE4, 0xEE, 0xF8, 0xDF, 0x78, 0xDF, 0x78, 0xFF, 0xF8, 0x7F, 0xF0, 0x7F, 0xE0, 0x3F, 0xC0, 0x07, 0x00, 0x00, 0x00 };

// Логика игры (упрощенно)
int birdY, gravity, score, bestScore;
int wallX[2], gapY[2];
#define GAP_SIZE 30

void setup() {
  Wire.begin(I2C_SDA, I2C_SCL);
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

// ... остальная часть кода ... 
// Полный код доступна на GitHub: https://github.com/ESPBoards/ESPBird
Демонстрация игры ESP Bird
Творчество

Кастомизация спрайтов

Вы можете легко изменить внешний вид птицы, используя наш инструмент Monochrome Bitmap Tool.

  1. Нарисуйте своего персонажа в сетке 16x16.
  2. Нажмите «Generate Binary».
  3. Замените массивы bird_frame1 и bird_frame2 в своем коде.
Редактор спрайтов птицы
Игра со смайликом

Пример кастомного спрайта-смайлика

Итог

Заключение

Мы создали полноценную игру на минимальном наборе железа. ESP Bird показывает, что даже простые OLED-экраны могут обеспечивать интерактивный игровой опыт.

Куда двигаться дальше?

  • Добавьте зуммер для озвучки прыжков и падений.
  • Реализуйте сохранение рекорда во FLASH-память, чтобы он не пропадал после выключения.
  • Увеличивайте скорость движения труб по мере набора очков для усложнения игры.

Готовы к полету?

Скачивайте код, подключайте OLED и пробуйте побить собственный рекорд! Если у вас возникли сложности с подключением, загляните в наш вводный гайд по SSD1306.