В этой статье я хочу поделиться с вами своим практическим опытом разработки игры для iOS на основе open-source компонентов. Мы пройдемся по техническим решениям, которые были приняты во время разработки игры.
Первым делом я сел делать спецификацию для игры. Решил, что не напишу и строчки кода, пока не будет готова спецификация. Конечно в ходе разработки она менялась, но не значительно. Спецификация очень помогла не отойти от первоначальной задумки. По спецификациям рекомендую почитать статьи Джоэл Спольски: http://www.joelonsoftware.com/articles/fog0000000036.html
Одной из задумок игры было создать разнообразный геймплэй. Основной геймплэй представляет собой RTS:
А вот в бонусах юзеру предстоит пострелять в аркадном стиле и даже поучаствовать в поединках один на один:
За каждую стадию юзер получает нового юнита или новую способность. Первые стадии идут обучающие, а вот далее юзеру надо выстраивать свою стратегию, чтоб пройти уровень.
Изначально было принято решение писать игру на С++, так как уже были готовы ряд заготовок и не хотелось тратить время на изучение нового языка. А также не хотелось переходить c Visual Studio на XCode.
В качестве движка я рассматривал два варианта: Ogre3D и Irrlicht. Оба движка очень хороши. API у каждого движка понятный и разобраться с основными возможностями не составило труда. Irrlicht имеет меньшей размер, но ветка OGL-ES ещё не официальная. А вот у Ogre3D есть официальная ветка. Всё же выбор пал на Irrlicht, потому что проведённые тесты по скорости дали результат лучше, чем у Ogre3D.
Irrlicht предоставил мне следующий функционал:
• Рендеринг c OGL-ES.
• Загрузка моделей из файлов (я использовал формат DirectX)
• Билборды
• Анимированные модели
У Irrlicht есть свой XML парсер, но его использовать не рекомендую, потому что он мало функционален. Лучше использовать rapidxml или pugixml
Так же в архитектуре Irrlicht предусмотрена возможность дописывать расширения без изменения кода движка.
Первый движок, который я рассмотрел был tiny-js. После ряда тестов выяснилось, что он слишком медленный и никак не подходит для мобильной игры.
Далее я начал рассматривать LUA и AngelScript. По скорости оба движка давали хорошие результаты. AngelScript имеет С-подобный синтаксис, а также возможность легко привязывать C++, что и сыграло основную роль в выборе скриптового движка.
Пример привязки новой функции выглядит следующим образом:
Архитектуру AI для своего проекта я выбрал «behavior tree». Данная архитектура позволяет создавать сложные системы поведения и не заботиться о всевозможных переходах из состояния в состояния. Упрощённый пример такой архитектуры:
Добавление нового поведения в данной архитектуре очень простое: достаточно добавить новое поведение в конкретный узел дерева и всё.
Более подробно о «behavior tree» можно узнать из статьи «Introduction to Behavior Trees».
Весь код писался на Visual Studio. В Windows я использовал основную ветку Irrlicht, вместо тачев были клики мыши. Раз в неделю я компилировал текущую версию на XCode и тестировал на девайсе.
В ходе исправления утечек памяти очень сильно помогла библиотека VLD. Данная библиотека показывает информацию по утечке памяти с информацией о коде:
Небольшое видео того, что получилось:
Спецификация
Первым делом я сел делать спецификацию для игры. Решил, что не напишу и строчки кода, пока не будет готова спецификация. Конечно в ходе разработки она менялась, но не значительно. Спецификация очень помогла не отойти от первоначальной задумки. По спецификациям рекомендую почитать статьи Джоэл Спольски: http://www.joelonsoftware.com/articles/fog0000000036.html
Краткое описание игры
Одной из задумок игры было создать разнообразный геймплэй. Основной геймплэй представляет собой RTS:
А вот в бонусах юзеру предстоит пострелять в аркадном стиле и даже поучаствовать в поединках один на один:
За каждую стадию юзер получает нового юнита или новую способность. Первые стадии идут обучающие, а вот далее юзеру надо выстраивать свою стратегию, чтоб пройти уровень.
Графический движок
Изначально было принято решение писать игру на С++, так как уже были готовы ряд заготовок и не хотелось тратить время на изучение нового языка. А также не хотелось переходить c Visual Studio на XCode.
В качестве движка я рассматривал два варианта: Ogre3D и Irrlicht. Оба движка очень хороши. API у каждого движка понятный и разобраться с основными возможностями не составило труда. Irrlicht имеет меньшей размер, но ветка OGL-ES ещё не официальная. А вот у Ogre3D есть официальная ветка. Всё же выбор пал на Irrlicht, потому что проведённые тесты по скорости дали результат лучше, чем у Ogre3D.
Irrlicht предоставил мне следующий функционал:
• Рендеринг c OGL-ES.
• Загрузка моделей из файлов (я использовал формат DirectX)
• Билборды
• Анимированные модели
У Irrlicht есть свой XML парсер, но его использовать не рекомендую, потому что он мало функционален. Лучше использовать rapidxml или pugixml
Так же в архитектуре Irrlicht предусмотрена возможность дописывать расширения без изменения кода движка.
Скриптовый движок
Первый движок, который я рассмотрел был tiny-js. После ряда тестов выяснилось, что он слишком медленный и никак не подходит для мобильной игры.
Далее я начал рассматривать LUA и AngelScript. По скорости оба движка давали хорошие результаты. AngelScript имеет С-подобный синтаксис, а также возможность легко привязывать C++, что и сыграло основную роль в выборе скриптового движка.
Пример привязки новой функции выглядит следующим образом:
_engine->RegisterGlobalFunction("void MyFunc()", asFUNCTION(MyFunc), asCALL_CDECL);
void MyFunc()
{
// Do some work
}
AI
Архитектуру AI для своего проекта я выбрал «behavior tree». Данная архитектура позволяет создавать сложные системы поведения и не заботиться о всевозможных переходах из состояния в состояния. Упрощённый пример такой архитектуры:
Добавление нового поведения в данной архитектуре очень простое: достаточно добавить новое поведение в конкретный узел дерева и всё.
Более подробно о «behavior tree» можно узнать из статьи «Introduction to Behavior Trees».
Разработка
Весь код писался на Visual Studio. В Windows я использовал основную ветку Irrlicht, вместо тачев были клики мыши. Раз в неделю я компилировал текущую версию на XCode и тестировал на девайсе.
В ходе исправления утечек памяти очень сильно помогла библиотека VLD. Данная библиотека показывает информацию по утечке памяти с информацией о коде:
Результат
Небольшое видео того, что получилось: