Pull to refresh

Маленький мультиплатформенный 2d движок tengine (android/ios/win32/nix/kolibrios/web(emscripten))

Reading time 4 min
Views 18K
Приветствую всех, кому стало интересно узнать о моем небольшом проекте, которым занимаюсь в свободное от работы время, о своем долгоиграющем проекте под названием «tengine».

Какова же цель этого поста? Ответ простой — я ищу однодумцев. Я верю в то, что есть еще много людей, которым нравится славный и добрый олдскул. В этом и вся миссия — писать удовольствия ради что-то маленькое, но вполне функциональное, платформу для «приставочных» игрушек в стиле 8/16 бит.

tengine DEMO game (web version) управление: клавиши со стрелкам, ctrl. Полноценная концовка.

Главная особенность, отличающая tengine от сотен подобных поделок — не совсем стандартная идеология:
  • архитектура проекта делает упор на минимизацию использования динамической памяти. Если память и выделяется, она выделяется исключительно на инициализации подсистем
  • использовать динамическую память нужно так, как будто не существует операционной системы, постоянно помнить о фрагментации. Удаление памяти происходит в строго обратном порядке создания (за этим следит простой механизм контроля удаляемых указателей)
  • использование сторонних библиотек сведено к минимуму и должно быть аргументировано, зачастую это потенциальный источник фрагментации памяти
  • игровая сцена представляет собою готовую для использования память, сгенерированная редактором уровней
  • работа с объектами сцены игры ведется исключительно через идентификаторы, динамически создать объект невозможно
  • использование fixed point вместо float
  • мультиплатформенность
  • официальный язык проекта — си


Изначально я все это писал под nintendo ds, мою любимую игровую платформу. Но времена меняются и пришлось все переместить в более популярный мир технологий. Так появилась ветка для андроида, которая и стала в последствии основной. win32 версия играет более отладочную роль. По задумке игра пишется и отлаживается на win32, а потом компилится на другие платформы (все это конечно же условно, на win32 весь функционал работает полноценно). С появлением одного очень хорошего энтузиаста, проект обрел еще и NIX платформу, за что ему огромное спасибо. Хоть nintendo ds уже и не поддерживается, я умышленно не убрал платформенный код под ключом препроцессора из проекта. Также остались некоторые нинтендо-специфические архитектурные особенности, такие как поддержка нескольких экранов и логических слоев отрисовки. Все это описано в скудненькой, но все же документации.

Сейчас tengine представляет собой:
  • готовый мультиплатформенных функционал для android ndk, ios, win32, nix, kolibriOS, Emscripten (был еще функционал для nitro-sdk (nintendo ds), но я решил не продолжать развитие этой ветки из-за нехватки времени, вероятность, что кому-то сейчас интересен nitro очень мала)
  • браузерная версия js/html на основе Emscripten (https://github.com/kripken/emscripten/wiki), хорошая работоспособность даже на ie11
  • использование памяти по принципу frame allocator (удаление памяти в строго обратном порядке созданию)
  • архитектурное ограничение создания динамических объектов, что позволило отказаться от использования скриптовых языков
  • использование openGL es 1.x/2.0 а так же самописного блиттера для рендеринга
  • использование openAL (openSL es для android NDK) для звука
  • поддержка мультитача, dpad, клавиатуры
  • поддержка многопоточности на основе pthread (подгрузка потоковой анимации, работа с файлами, звук)
  • функционал для работы с сетью на начальной стадии
  • (примитивная) система партиклов
  • конвертер графических ресурсов (r5g5b5a1 основной и r8g8b8a8 вспомогательный)
  • простой интерфейс для работы с игровыми объектами: позиции, свойства, состояния
  • события (окончание анимации, достижение ноды и т.д.)
  • поддержка применения базовых афинных преобразований для кадров анимации игровых объектов
  • возможность попиксельной проверки границ игрового объекта сложной формы
  • поддержка тайловой карты
  • поддержка полупрозрачности
  • поддержка смешивание данных изображения с указанным цветом
  • поддержка логики путевых нод (по которым могут двигаться объекты)
  • (частично реализованная) система коллижн-линий, с помощью которых можно задавать границы или места «проходимости» под произвольным углом
  • эмулятор для win32/nix, упрощающий разработку и отладку приложения
  • базовая документация

В дополнение ко всему этому есть подсистема gui, являющаяся надстройкой над tengine. Основная идея: все элементы gui — обычные игровые объекты, которые при инициализации обретают уже предустановленный функционал элементов gui таких как, например, «кнопка». Достаточно зарегистрировать любой игровой объект в gui контейнере и указать какое поведение от него ожидается. Все остальное надстройка берет на себя.

Редактор уровней (me3) представляет собою утилиту для создания «уровней» для tengine и включает в себя:
  • подсистему работы с графическими ресурсами
  • подсистему создания сложной покадровой анимации, включая коллижн-зоны, пользовательские события, точки прикрепления (для динамического прикрепления других игровых объектов, например оружие к руке)
  • подсистему создания тайловой карты бэкграунда
  • подсистему триггеров, с помощью которых можно менять свойства объектов по определенным условиям
  • подсистему путевых нод
  • подсистему создания коллижн-линий
  • подсистему создания логических состояний объектов, завязывание их на анимацию
  • подсистему создания свойств объектов и работы с ними
  • менеджер объектов
  • отладка готовой карты, отслеживание работы триггеров, пользовательских событий
  • поддержка шрифтов, текстовых полей (текстовые объекты), внутренний текстовый редактор
  • поддержка функционала для локализации текстов на разные языки
  • создание готовых бинарных файлов с данными для tengine, экспорт в xml

Разобраться с редактором немного трудновато поначалу, я его писал специально под своего знакомого геймдизайнера. Но есть примеры в папке samples а также интерфейс на русском, который, как по мне, довольно интуитивен. Документацию, к сожалению, пока не осилил написать.

Кому все еще интересно, все доступно на https://bitbucket.org/pascualle/tengine

Как бонус, совсем не давно спортировал verlet библиотечку, описанную в посте habrahabr.ru/post/178135. Пока она стоит немного особнячком, но уже проверена на работоспособность (смотрите пример в samples/spider)

Читайте также небольшой туториал (внимание, он без картинок!) «Создание небольшой игры с помощью tengine» habrahabr.ru/post/180443
Tags:
Hubs:
+17
Comments 26
Comments Comments 26

Articles