Превращаем связку ESP32 и OLED-дисплея в полноценную игровую консоль! В этом уроке мы создадим ESP Bird — клон знаменитой игры Flappy Bird, оптимизированный для работы на монохромном экране 128x64.
Содержание
В предыдущей статье мы научились подключать OLED-дисплей SSD1306 к ESP32-S3 и работать с кнопкой. Теперь мы используем эти знания для создания динамичной игры.
Необходимые детали
Схема подключения остается прежней. Нам важны три компонента:
ESP32 S3 SuperMini
Компактный и мощный контроллер. Подойдет и любая другая плата ESP32.
OLED SSD1306
Дисплей 128x64 пикселей с интерфейсом I2C.
Также понадобится обычная тактильная кнопка (12x12 мм или 6x6 мм) для управления прыжком.
Разбор игровой механики
ESP Bird — это упрощенная версия Flappy Bird. Основные элементы:
- Гравитация: Птица постоянно падает вниз.
- Прыжок: Нажатие кнопки придает птице импульс вверх.
- Препятствия: Вертикальные трубы с проемами случайной высоты, движущиеся справа налево.
- Коллизии: Проверка столкновения птицы с трубами, небом или землей.
Экран окончания игры с отображением текущего и лучшего счета
Графика и рендеринг
Даже на OLED 128x64 можно добиться плавной картинки:
- Спрайты: Птица рисуется как битмап 16x16. У нее есть два кадра анимации для имитации взмахов крыльев.
- Трубы: Отрисовываются как закрашенные прямоугольники.
- Частота кадров: Игра работает со скоростью около 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
Кастомизация спрайтов
Вы можете легко изменить внешний вид птицы, используя наш инструмент Monochrome Bitmap Tool.
- Нарисуйте своего персонажа в сетке 16x16.
- Нажмите «Generate Binary».
- Замените массивы
bird_frame1иbird_frame2в своем коде.
Пример кастомного спрайта-смайлика
Заключение
Мы создали полноценную игру на минимальном наборе железа. ESP Bird показывает, что даже простые OLED-экраны могут обеспечивать интерактивный игровой опыт.
Куда двигаться дальше?
- Добавьте зуммер для озвучки прыжков и падений.
- Реализуйте сохранение рекорда во FLASH-память, чтобы он не пропадал после выключения.
- Увеличивайте скорость движения труб по мере набора очков для усложнения игры.
Готовы к полету?
Скачивайте код, подключайте OLED и пробуйте побить собственный рекорд! Если у вас возникли сложности с подключением, загляните в наш вводный гайд по SSD1306.