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 128x64 OLED Display Module SSD1309

    — На этом все, спасибо за внимание!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 14

      0
      А алгоритм спаунинга кактусов скорости и пр. как-то портирован из оригинала, или просто сделано по визуальному образу и подобию?
        +3
        Механика сделана по визуальному подобию. Вид кактуса и ширина выбираются случайно. Сложные для перепрыгивания варианты появляются реже тех, что проще. Птеродактиль имеет 3 фиксированных «высоты полета» и появляется в 3-5 раз реже кактуса. С набором очков скорость игры увеличивается, что создает ощущение более частого появления «врагов».
        Спрайты близко основаны на оригинале.
          +1
          А ночь, как в оригинале, наступает?
            +2
            Да, ночь/день меняются каждые 0x400 очков. Правда ночь очень простая — дисплей переводится в инверсный режим (видно к концу видео).
        +3

        Еще один из представителей подобных консолей — arduboy, с таким же экраном и на ардуине.

          0
          Насколько я понял, просмотрев исходники по диагонали, у вас есть двойная буферизация посредством некоего канваса. Зачем? Пустая трата ресурсов. Легче ведь просто выводить спрайты напрямую на дисплей.
            +6
            Буферизация одинарная (и та не настоящая, см. статью). На экран сразу не получится, т.к. он write-only, а нужно как-то накладывать маску спрайта на имеющиеся изображение (иметь возможность погасить пиксели, которые были включены другим спрайтом перед тем, как они отобразятся).
              0
              Вы правы. Я не увидел, что у экрана нет операции чтения пиксела.
            0
            а почему конкретно не поместилось в тиньку?
              0
              «Не поместилось» — это условно, конечно. Просто от игры пришлось бы отрезать больше, чем я бы хотел. Сейчас прошивка примерно 14кб. Я попробовал убрать все маски из спрайтов, уменьшить статичные спрайты (типа «game over»), уменьшить кол-во спрайтов «земли», убрать виртуальные функции и все равно добился только 8.3кб (напомню, что в Attiny85 8кб ROM). В таком варианте игра уже стала выглядеть заметно хуже. А далее пришлось бы резать механику: например, убрать птеродактилей или сделать меньше типов кактусов. На это я пойти никак не мог.
              0
              Имея такой девайс, пользователи Firefox тоже смогут поиграть в T-Rex’а при ошибке загрузки страницы.
              Немного не понял, причем тут FireFox
                0
                В Chrome браузер и многие его ответвления (была?) встроена мини-игра, которая включается при ошибке загрузки страницы (или при отсутствии сети).
                  +2

                  chrome://dino/
                  Вот прямая ссылка.

                    0

                    Моя дочь благодарит вас :)

              Only users with full accounts can post comments. Log in, please.