T-Rex-duino – клон игры про динозавра из браузера Chrome для Arduino
Имея такой девайс, пользователи Firefox тоже смогут поиграть в T-Rex«а при ошибке загрузки страницы.
Начну с того, что меня заинтересовали самодельные супер минималистичные портативные игровые консоли. В частности, очень популярен вариант ATtiny85 + OLED дисплей:
Вот человек уже сделал 13+ игр для такой платформы.
Забавный гаджет, но после сборки играть на нем долго не хочется. На мой вкус, имеющиеся игры недостаточно «скоростные», чтобы можно было поддерживать интерес хотя бы в течении нескольких минут. Поэтому решил сделать игрушку, в которую сам бы захотел поиграть минут 10–20 и может даже два-три раза. Благо, уже давно была на примете относительно интересная игра, затягивающая и достаточно простая для помещения в микроконтроллер.
Поле 4 выходных работы получился такой клон.
Youtube видео
К сожалению, уместиться в ROM ATtiny85 не удалось, поэтому пришлось воспользоваться классической Arduino. Сейчас даже считаю, что это более выигрышный вариант, т.к. Arduino более доступна, ее проще прошить и есть куда расширяться.
Игра имеет дополнительные «фитчи»: ти-рекс может нагибаться (хотя это не обязательно, можно просто прыгать!), добавлены «жизни» для продления геймплея.
Можно поиграться с параметрами игры (такие как скорость, частота «врагов» и подобное), многие настройки вынесены в начало скетча.
Сборка
В минимальном варианте понадобится Arduino Uno / Nano / Mini, OLED дисплей 128×64 на контроллере SSD1309 и одна или две кнопки. В портативном варианте нужно будет добавить аккумулятор со схемой заряда или батарейки.
Схема.
После сборки нужно прошить скетч из дерриктории t-rex-duino/
(ссылка на репозиторий в конце статьи).
Некоторые детали реализации
Привожу тут некоторые подробности, которые могут пригодится тем, кто захочет сделать свою мини-игру. Старался писать «движек» так, чтобы на нем удобно было делать игры, основанные на рендере спрайтов и детекции их «столкновений» (вообще, это чуть ли не единственные две функции «движка», на них построена вся игра). Сейчас осталось еще очень много свободных ресурсов, более 50% по производительности и памяти.
Т.к. я изначально рассчитывал на маленький микроконтроллер, в котором всего 512 байт RAM и в 2 раза меньше частота, чем у камня ардуины, для игры был написан быстрый рендер с «виртуальным» буфером, который рендерит экран по вертикальным или горизонтальным кусочкам.
Вертикальный виртуальный буфер требует минимум 128 байт памяти, а горизонтальный — от 8 байт. При этом полный буфер всего экрана занял бы 1 кб. Направление рендера следует выбирать так, чтобы оно совпадало с основным направлением движения на экране (меньше искажений). В начале скетча есть переключение режима рендера, для демонстрации работы обоих вариантов.
Каждый спрайт в игре описан точкой экрана в которую нужно его отрендерить и двумя однобитными битмапами: «данные» и «маска». Эти два битмапа описывают однобитное изображение с «прозрачностью». Т.е. каждый пиксель в спрайте может быть «белым», «черным» или «прозрачным». Вместе с кодом проекта есть python-утилита game-assets-gen/img-conv.py
конвертации png в с-массивы соответствующих битмапов. Для запуска процесса перегенерации существующих битмапов можно запустить gen_assets.bat
находясь в game-assets-gen/
.
Также, привожу поясняющую картинку по используемой координатной системе.
Ссылки
Репозиторий проекта: github
Доступны схема, исходники для Arduino, утилита для конвертации изображений в используемый в игре формат битмапов.
Модуль дисплея: diymore 2.42 inch 128×64 OLED Display Module SSD1309
— На этом все, спасибо за внимание!