КОТ++
Прикладное программирование
Системное программирование
Программирование микроконтроллеров

Программирование — это не наука, а ремесло. (c) Ричард Столлман

Поиск по тегам

Опубликовано
Комментарии 0

В этой публикации хочу поделиться подробностями разработки моего игрового движка. В первую очередь статья нацелена на людей, которые вообще без понятия как работают игровые движки, и для небольшого общего понимания я предлагаю ознакомиться с простым концептом движка, который я сделал.

Почему я не взял готовый движок? Во-первых, NIH, я уже писал про это (там я и сказал пару слов о движке), во-вторых, желание разобраться в работе движков. Движок был назван изначально EEngine – Egor Engine, это название я придумал ещё до момента, когда был выработан концепт движка, после того как уже был готовый движок у меня появилась небольшая капля скромности и название мне перестало нравиться. Но я его не стал менять, просто первую букву E нужно расшифровывать как-то иначе.

Концепт движка заключается в следующем: EEngine отрисовывает графику через GPU – graphics processing unit, на мобилках это видеочип, на компах это видеокарта. GPU по сути работает с 3D графикой, но мой движок 2D, а 2D для GPU это тот же 3D только без манипуляций осью Z, представьте плоский куб, у которого толщина равна 0, на передней и единственной грани рендерится (отрисовывается) текстура – спрайт.

Отрисовка производится шейдерами. Шейдеры – это программы для рендеринга, которые скармливаются GPU, они сообщают видеочипу как отрисовывать каждый пиксель. Так как GPU манипулирует только треугольниками, то в шейдере в общих словах алгоритм таков: рисуем два треугольника, два треугольника это по сути прямоугольник, потом берём текстуру и натягиваем поверх нарисованного треугольника – так мы получим отрисованный 2D спрайт. То есть каждый графический объект является прямоугольником из двух треугольников, такая конструкция называется мешом, меш – набор треугольников определяющих форму графического объекта.

Работа движка осуществлена с помощью паттерна «Игровой цикл», в общем виде игровой цикл должен выглядеть так:

while (1)
{
	processInput(); //обработка пользовательского ввода
	update(); //обработка логики игры 
	render(); //отрисовка
}

В бесконечном цикле вызываются у корневой сцены методы processInput(), render() и update(). Общая суть паттерна игровой цикл в том, что есть бесконечный цикл, а в нём последовательно обрабатываются пользовательский ввод (processInput), отрисовка (render), просчёт логики игры (update) и просчёт физики (физику не разбираю в этой статье). О игровых паттернах очень хорошо рассказано в этой книге, как раз таки в ней я о них и узнал.

Все графические объекты являются нодой (узлом) связного списка, в итоге возможность ноды иметь дочерние объекты порождает дерево графических объектов, отрисовка выполняется обходом по дереву, у каждой ноды берётся текстура и отрисовывается по необходимым координатам шейдером. Аналогичным образом идёт вызов метода update() у объектов. И аналогичным образом реализованы сигналы и слоты у элементов UI, реализовал работу сигналов-слотов будучи вдохновлённым Qt. UI элементы это те же графические элементы, но расширены функционалом сигналов-слотов для работы с пользовательским вводом. У UI элемента достаточно подписаться на определённое событие, добавив слот. Потом когда движок породит сигнал, что событие произошло, то также через обход дерева найдётся объект, который был подписан на этот сигнал.


root – корневая нода, с неё начинается обход дерева

Также был реализован пул объектов, что очень полезно в играх, где требуется постоянное появление одинаковых объектов, вместо удаления и создания, движок кладёт объект в пул и при надобности достаёт из пула, это существенно экономит вычислительные ресурсы.

После я принялся за разработку физического движка, к сожалению работу над физическим движком я не завершил до конца. Если у меня дойдут руки, то выложу материал по физическому движку.

Технические подробности (новичкам можно пропустить абзац): движок был написан на AS3, использован для мобильных игр на Adobe AIR, например эта. Движок я не выполнил отдельной библиотекой, поэтому исходники смешаны с исходниками самой игры по ссылке, потому что разрабатывал его параллельно с написанием игры. Изначально игра была написана чисто на Flash без движков, но настал момент, что потребовалась оптимизация, для оптимизации я решил написать свой движок. Шейдеры были написаны на AGAL – Adobe Graphics Assembly Language, адобовский мини ассемблер. Бесконечный цикл у меня реализован не особо привычном образом, флеш генерирует событие ENTER_FRAME строго соотвествуя FPS и я подключил цикл к этому событию.

Теги , , , , ,
Автор

Опубликовано
Комментарии 0

Как-то много раз передо мной мелькали различные статьи по поводу языка Haxe, описывали его достаточно красочно, и я очень сильно загорелся попробовать что это такое собственно. Для тех кто совсем не в курсе: Haxe позволяет транслировать свой код в код других языков (php, javascript, flash, c++, java, c#). Тем самым достигается мультиплатформенность. На словах, конечно, очень всё красиво и замечательно. Но на деле всё несколько иначе.

Чтобы плотно познакомиться с этим языком, я решил, что возьму свой старый flash проект и попробую переделать на Haxe. Почему flash? Да потому, что синтаксис Haxe максимально близок к синтаксису ActionScript 3, так заявлено разработчиками, на деле же есть множество маленьких несостыковок, из-за которых пришлось конкретно промучаться при переделывании проекта. Обрадовало, что для Haxe есть очень хорошая среда HaxeDevelop, это практически копия среды FlashDevelop, за которой я создал несколько игр, так что было очень приятно увидеть уже знакомый интерфейс.

И так, я беру проект Hot Jihod и начинаю пытаться собрать его под Haxe. Также очень круто, что под Haxe есть библиотека OpenFL, которая практически повторяет Flash, что существенно упрощает работу по сборке проекта в Haxe. Но на деле я промучался с жутким синтаксисом языка Haxe, меня очень расстроили циклы, синтаксис циклов for очень стал далёк от синтаксиса циклов for в C/C++, я считаю, что такие циклы for как в Haxe очень понятны и удобны новичкам в программировании, а для тех кто выучил C/C++ такой синтаксис только раздражает.

for (var i: int = 0; i < rest.length; i++) //AS3 синтаксис 
for (i in 0…rest.length) //синтаксис Haxe, 1-ый вариант
for (item in rest) //синтаксис Haxe, 2-ой вариант

Кто-то скажет: «что в Haxe то лучше!». Возможно в каком-то смысле так и есть. Но мне не по душе такие циклы, да и к тому же пришлось ходить по всему коду и исправлять циклы на Haxe вариант. И ещё на самом деле очень много чего исправлять пришлось, по сути обещанный ActionScript подобный синтаксис я не особо получил.

Но и самое главное, что в итоге, когда проект собрался, то игра не заработала, она не заработала ни под одну платформу. Вывод графики напоминал то, что программа неправильно обрабатывает шейдеры. Хотя под некоторые платформы был какой-то проблеск того, что вроде какая-то там графика пытается нарисоваться, но например под HTML5 вообще пусто, чёрный экран. А я то ведь уже замечтался, что у меня в руках хороший инструмент, который почти Flash, и с помощью него я смогу делать игры и под Windows и под HTML5, используя по сути всё тот же Flash. В общем я проверил отрисовку через GPU, правильные ли остались шейдеры от прежней программы, потратил на это несколько часов. В итоге пришёл к выводу, что эта OpenFL очень сырая, отрисовка через GPU содержит много ошибок и не повторяет того как работает Flash.

Но может быть Haxe применим в чём-то другом? Я попробовал поискать вакансии на hh.ru с ключевым словом Haxe, но он нашёл ровно 0 результатов. Мой вывод: Haxe и библиотеки под него работают достаточно криво, сфера использования этого языка очень ограничена (если вообще существует), изучать и копаться в нём нет смысла, так как он никому не нужен, а для самостоятельного использования не даёт нужного результата.

Теги , ,
Автор

Опубликовано
Комментарии 0

Splinter Jump – вторая игра моего авторства. Вдохновлённый игрой Doodle Jump, а она была очень популярная почти 8 лет назад, я решил сделать свою игру с похожей механикой. Кроме паскаля я тогда ничего не знал, соответственно, и эта игра была написана на паскале, в среде PascalABC.NET. Суть игры заключается в том, чтобы прыгать по платформам и добраться до верха и найти телевизор. На уровне разбросаны сыр и напитки. Сыр нужно собирать для зарабатывания очков, напитки дают улучшенный прыжок на ограниченное время. Игра полностью завершённая, в ней реализованы все задуманные уровни, в игре 10 уровней, в некоторых уровнях присутствуют боссы. Персонаж игры может атаковать, соответственно механика не ограничена только прыжками по платформам.

Через пару лет, когда изучил flash, то я решил переписать эту же игру на нём и загрузить её во ВК. Но к сожалению, ВК больше не поддерживают flash игры и они отключили мою игру. Первые четыре скрина – версия для windows, написанная на pascal, последние четыре скрина – flash версия для ВК, написанная в среде FlashDevelop, как видно по скрину была добавлена возможность поставить игру на паузу.

Исходный код pascal версии: https://bitbucket.org/Eg0r/splinter-jump




Теги , , , ,
Автор

Опубликовано
Комментарии 0



В этом посте хочу рассказать про одну из игр написанных мной. Игру я делал при участии в команде разработчиков VilPig. Суть игры в том, что пользователю предстоит управлять горячим Джиходом, захватывать нефтяные вышки и уничтожать вражеских для него солдат. В игре присутствует широкий арсенал оружия, а также большое разнообразие врагов. Геймплей в игре бесконечный.

Приложение разработано под Андроид с использованием технологий Adobe Air. Также в игра построена на базе моего движка, о котором можно прочитать тут. Все аспекты этого «секретного» движка можно будет узнать в следующих статьях.

Ссылка: https://play.google.com/store/apps/details?id=air.com.varvar.jihod

Теги , , ,
Автор