Начну с того, что меня заинтересовали самодельные супер минималистичные портативные игровые консоли. В частности, очень популярен вариант 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 128x64 OLED Display Module SSD1309
— На этом все, спасибо за внимание!
Felan
А алгоритм спаунинга кактусов скорости и пр. как-то портирован из оригинала, или просто сделано по визуальному образу и подобию?
Alex-111 Автор
Механика сделана по визуальному подобию. Вид кактуса и ширина выбираются случайно. Сложные для перепрыгивания варианты появляются реже тех, что проще. Птеродактиль имеет 3 фиксированных «высоты полета» и появляется в 3-5 раз реже кактуса. С набором очков скорость игры увеличивается, что создает ощущение более частого появления «врагов».
Спрайты близко основаны на оригинале.
khim
А ночь, как в оригинале, наступает?
Alex-111 Автор
Да, ночь/день меняются каждые 0x400 очков. Правда ночь очень простая — дисплей переводится в инверсный режим (видно к концу видео).