Хабрахабр

Игровая консоль и игры к ней своими руками. Little Game Engine + ESPboy

Little Game Engine (LGE) – это виртуальная игровая консоль выдуманной конфигурации, с выдуманным процессором и онлайн web-SDK, состоящий из компилятора С-подобного кода в ассемблер и дальнейшей перекомпиляцией его в машинный код с возможностью исполнения этого кода там же, в онлайн в эмуляторе.

Более 20 игр уже готовы, несколько в разработке. Как видно из названия, заточен весь комплект на быстрое создания 2d ретро игр.

Чтобы поиграть онлайн, перейдите по ссылке игры ниже, выберете «compile» и затем «run».

TankCity, 1916, FourInaRow, BlackJack, ZombieDefence, MicroRace, DwarfClicker, Galaxies, Memories, NinjaEscape, Mines, Breakout, TowerDefence, FlappyBird, WormBlast, ESProgue, Snake, FishLife, Columns, MarsAttack, CityRunner, Asteroids, Bashe…

Отдельный плюс в том, что эмулятор LGE virtual machine помимо онлайн версии написан и для ESPboy гаджета, который имеет сходную с LGE VM переферию воплощенную в железе и про который я уже писал.

  • цветной экран разрешением 128х128,
  • 8 кнопок,
  • однобитный звук
  • RGB светодиод
  • подходящий по скорости эмуляции микроконтроллер ESP8266
  • встроенную флеш память с файловой системой SPIFFS

Таким образом можно загружать откомпилированные в онлайн LGE SDK игры в портативный ESPboy, брать его с собой и с интересом коротать свободные минуты.

заргрузка файлов на spiffs), так и через WiFi. Загружать игры можно, как по проводу (см. Удерживая при запуске ESPboy кнопку «B», мы превращаем гаджет в точку доступа, и подключившись к ее WiFi сети с именем «ESPboy» через браузер, попадаем в веб интерфейс файловой системы, где можно, как удалять файлы, так и загружать новые.

Остается только собрать гаджет, на что есть схемы, инструкции и kit набор для сборки, который вскоре будет доступен на tindie.com.
Наигравшись в существующие игры – можно довольно быстро начать писать свои.

Краткая спецификация LGE виртуальной машины:

  • Набор из 108 инструкций навеян CHIP8/SCHIP и микропроцессором MOS6502.
  • 16 регистров по 16 бит, нулевой регистр является указателем стека.
  • Каждая инструкция двухбайтовая, некоторые инструкции содержат после себя два байта данных
  • Адресуемая память 20Kб.
  • Кроме обычных арифметических инструкций и инструкций перемещения данных, есть отдельные инструкции для работы со спрайтами, экраном и звуком.
  • Размер экрана 128х128 пикселей, 16 цветов на точку, что занимает 8Kб памяти, еще столько же занимает буфер для рисования спрайтов и частиц.
  • Обновление экрана около 20 кадров в секунду.
  • Можно рисовать тайлы и 32 спрайта размером до 128х128 пикселей с возможностью вращения и зеркалирования.
  • Поддерживается работа с частицами.
  • Для экономии памяти можно использовать однобитные изображения или RLE сжатие.
  • Присутствует упрощенная физика: обнаружение столкновений спрайтов со спрайтами и тайлами, разрешение столкновений, гравитация.
  • Экран обновляется построчно, только если в строке произошло изменение пикселей.
  • Скорость VM в зависимости от того, сколько строк отрисовывается в кадре, варьируется от 100 тысяч до 900 тысяч операций в секунду.
  • Можно использовать разные цветные экраны, есть программное растягивание изображения.

Чтобы не писать напрямую в опкодах, в SDK входит самописный компилятор «LGE С», представляющий из себя «C» образный язык высокого уровня. На данный момент этому компилятору далеко до полной поддержки стандартов языка C и при компиляции можно легко столкнуться с непонятной ошибкой в непонятном месте. Зато он быстр, ведь он занимает меньше 2000 строк исходного кода, а также постоянно развивается.

LGE онлайн среда разработки с компилятором и эмулятором
Описание виртуальной машины LGE
Руководство по LGE компилятору «C» образного языка
Исходный код игр LGE на LGE C

Если кто-то желает принять участие в создании новых игрушек на LGE или улучшении самого LGE SDK, а так же если кто-то заинтересовался сборкой ESPboy, добро пожаловать на форум www.espboy.com.
Там постараемся ответить на все вопросы и помочь в реализации идей. На LGE SDK уже сделано не мало игр и можно продолжать создавать новые прямо сейчас, однако до совершенства далеко.

Занимает меньше ста строк и размером не более 1Kб в скомпилированном виде. Для настойчивых и заинтересовавшихся ниже короткий пример игры на LGE SDK. Чтобы его запустить, необходимо зайти на онлайн LGE SDK, скопировать код в окошко «source», выбрать «compile» и затем «run».

Пример простой игры на LGE C

int stickCount;
char key,previouseKey,takenSticks;
void redraw(){ int i; //выбираем красный цвет setcolor(2); //рисуем видимые палочки for(i = 0; i < stickCount; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //выбираем серый цвет setcolor(11); //рисуем выброшенные for(i = stickCount; i < 15; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //возвращаем белый цвет как основной setcolor(1); //ждем перерисовки экрана delayredraw();
} void playersMove() while(key != KEY_LEFT && key != KEY_DOWN && key != KEY_RIGHT){ key = getkey(); } if(key & KEY_LEFT){ takenSticks = 1; }else if(key & KEY_DOWN){ takenSticks = 2; }else{ takenSticks = 3; } printf("%d, ", takenSticks); stickCount -= takenSticks; previouseKey = key;
} void computersMove(){ if(stickCount % 4){ //компьютер реализует выигрышную стратегию, если выпала возможность takenSticks = stickCount % 4; }else{ //компьютер ждет возможности реализовать выигрышную стратегию takenSticks = 1 + random(1); } stickCount -= takenSticks; printf("%d, ", takenSticks);
} void game(){ //инициализация stickCount = 15; clearscreen(); //переводим каретку на восьмой символ нулевой строки gotoxy(8,0); puts("Баше"); gotoxy(2,1); puts("Возьмите 1,2 или 3 палочки. Проигрывает тот, кому нечего брать. Управление:\n"); //коды 27,25 и 26 соответствуют стрелкам printf(" %c 1 %c 2 %c 3", 27, 25, 26); gotoxy(0,12); redraw(); while(1){ playersMove(); if(stickCount <= 0){ gotoxy(3,8); puts("Вы выиграли"); return; } redraw(); computersMove(); redraw(); if(stickCount <= 0){ gotoxy(3,8); puts("Компьютер выиграл"); return; } }
} void main(){ while(1){ game(); //ждем секунду settimer(1,1000); while(gettimer(1)){} while(getkey() == 0){} previouseKey = key; }
}

Всем добра и успехов в творчестве.

С уваженеием,
Роман

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»