- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

TankCity [3], 1916 [4], FourInaRow [5], BlackJack [6], ZombieDefence [7], MicroRace [8], DwarfClicker [9], Galaxies, Memories, NinjaEscape [10], Mines, Breakout, TowerDefence [11], FlappyBird, WormBlast [12], ESProgue [13], Snake, FishLife [14], Columns [15], MarsAttack [16], CityRunner, Asteroids, Bashe [17]

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

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

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

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

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

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

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

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

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

Краткая спецификация 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 онлайн среда разработки с компилятором и эмулятором [2]
Описание виртуальной машины LGE [23]
Руководство по LGE компилятору «C» образного языка [24]
Исходный код игр LGE на LGE C [25]

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

Для настойчивых и заинтересовавшихся ниже короткий пример игры на LGE SDK. Занимает меньше ста строк и размером не более 1Kб в скомпилированном виде. Чтобы его запустить, необходимо зайти на онлайн 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 == previouseKey){
		key = getkey();
	}
	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;
	}
}

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

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

Автор: RomanSk

Источник [27]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/333728

Ссылки в тексте:

[1] Little Game Engine (LGE): https://hackaday.io/project/164205-esp-little-game-engine

[2] онлайн web-SDK: https://corax89.github.io/esp8266Game/index.html

[3] TankCity: https://corax89.github.io/esp8266Game/index.html?src=8a1a7364aaea25625eadc971dc383644

[4] 1916: https://corax89.github.io/esp8266Game/index.html?src=ac92a491cb80cf65b7741877bfb21e2a

[5] FourInaRow: https://corax89.github.io/esp8266Game/index.html?src=2aa481d0b7511c7c22d8faa971475b6f

[6] BlackJack: https://corax89.github.io/esp8266Game/index.html?src=3df6f51b6bb06f472bf6beb839a1f57d

[7] ZombieDefence: https://corax89.github.io/esp8266Game/index.html?src=0efd4445900ed81410c1cc03eb03ec1d

[8] MicroRace: https://corax89.github.io/esp8266Game/index.html?src=9d1af8e3aac1d6616c990ff52503abf7

[9] DwarfClicker: https://corax89.github.io/esp8266Game/index.html?src=3a428b5cf4409cb87a9e59e08d74d3bb

[10] NinjaEscape: https://corax89.github.io/esp8266Game/index.html?src=d7ddb9590c429f3f5818cd99be6588aa

[11] TowerDefence: https://corax89.github.io/esp8266Game/index.html?src=6d26cfe7c9a3518fdf3bfacc81884a4e

[12] WormBlast: https://corax89.github.io/esp8266Game/index.html?src=e6615c103455495539efa5e0fc71bbd9

[13] ESProgue: https://corax89.github.io/esp8266Game/index.html?src=a6f1966fef4e388240743121f228570b

[14] FishLife: https://corax89.github.io/esp8266Game/index.html?src=10229352aa5d8061251ef1ab9c4e6e2c

[15] Columns: https://corax89.github.io/esp8266Game/index.html?src=ff9900f564775ddda422d28958b737c0

[16] MarsAttack: https://corax89.github.io/esp8266Game/index.html?src=fa37869a6fad2bf9e098ee34f621ba97

[17] Bashe: https://corax89.github.io/esp8266Game/index.html?src=6ca18ff8b2718c059d07c93374145d36

[18] ESPboy гаджета: https://hackaday.io/project/164830-espboy-games-iot-stem-for-education-fun

[19] уже писал: https://habr.com/ru/post/469647/

[20] заргрузка файлов на spiffs: https://www.youtube.com/watch?v=25eLIdLKgHs

[21] схемы: https://easyeda.com/roman.sokolov/espboy-rev2-0a

[22] инструкции: https://hackaday.io/project/164830/instructions

[23] Описание виртуальной машины LGE: https://github.com/corax89/esp8266_game_engine/blob/master/esp_little_game_engine_description.pdf

[24] Руководство по LGE компилятору «C» образного языка: https://github.com/corax89/esp8266_game_engine/blob/master/esp_little_game_engine_user_guide.pdf

[25] Исходный код игр LGE на LGE C: https://github.com/corax89/game_engine_for_esp8266_with_compiler/tree/master/example

[26] www.espboy.com: http://www.espboy.com

[27] Источник: https://habr.com/ru/post/472114/?utm_campaign=472114&utm_source=habrahabr&utm_medium=rss