В последнее время у меня появляется желание делиться своими знаниями с другими людьми. Возможно, это связано с возрастом, возможно с тем, что есть что-то, чем можно было бы поделиться. В связи с этим, хотел бы рассказать об опыте разработки текущей игры, в которой мы используем сразу два редактора анимации. Мы – команда энтузиастов из двух человек. Занимаемся созданием игр под мобильные платформы около семи лет в свободное от основной работы время. Подавляющее большинство наших проектов написано с использованием cocos2d-x. Из них около 90% приходится на старую версию движка - cocos2d-x-2.2.6. Полтора года назад мы решили, создать новый проект - файтинг-платформер максимально возможного для нас качества под персональные компьютеры. И перейти уже на использование новой версии cocos2d-x-3.17.2. Так как мы ограничены в ресурсах, будь то финансы или время, мы приняли решение, что будем использовать хорошо знакомые нам инструменты для разработки и дальше. Мы понимаем, что важную роль в восприятии людьми картинки на экране играет плавность анимации и приятная графика. Поэтому игровые персонажи, у которых будут плащи и тому подобные элементы, нам необходимо будет анимировать с использованием mesh-анимации. В своих проектах мы используем в качестве редактора скелетной анимации CocoStudio 1.2.0.1. Хотя этот программный продукт уже несколько лет не поддерживается, он позволяет создавать хорошие анимации, с использованием точек событий внутри. Данный редактор очень хорошо нам знаком, так как используется более пяти лет. Найти в сети его уже вряд ли получится, но если у кого-то есть желание, можно его скачать из облака. Мы храним там все инструменты разработки, которые используем в своей работе. Для себя мы решили, что бо́льшая часть объектов и персонажей у нас будет создаваться именно в этом редакторе анимации, так как скорость работы в нем и доступный функционал нас устраивает. А для персонажей, которым необходимы будут более продвинутые анимации, мы будем использовать другой редактор. Редактор анимации Spine мы были вынуждены исключить. Тип лицензии Essential по функционалу ничем не отличается от используемого нами редактора анимации CocoStudio. Покупать лицензию Professional только ради использования mesh-анимации для нас пока дорогое удовольствие. По этой причине выбор второго редактора анимации пал на Dragonbones. Он позволяет без проблем экспортировать анимации из CocoStudio. Нам только остается самостоятельно установить точки событий. Приведу ссылку на DragonBonesC++ RunTime для добавления его в проект на cocos2d-x. После выбора второго редактора, дело осталось за малым. Необходимо было обеспечить в игре поддержку нескольких редакторов анимации. Изначально мы думали, что у нас будет поддержка трех редакторов анимации, но от использования Spine, как я написал чуть выше, мы отказались. Добавлять поддержку редакторов анимации в игру необходимо сразу. Как бы вы не документировали свой код и не описывали функции, при работе с интеграцией нового редактора анимации для почти готового проекта, могут появиться неприятные моменты. Я считаю, что гораздо правильнее на начальном этапе проработать и реализовать весь необходимый функционал, чтобы потом заниматься более интересными для себя вещами. Так как наш проект содержит элементы файтинга, обязательным для нас условием была возможность использования областей пересечений (hitbox`ов и hurtbox`ов) разных размеров. Кроме этого необходимо иметь точное время действия каждой области, отвечающей за взаимодействие при ударах персонажей. При этом дополнительным условием была возможность редактировать размеры и время действия областей пересечений в редакторе анимации. Видеть эти области в режиме отладки и отключать их в обычном режиме. Когда мы только начинали разработку универсального класса поддержки нескольких редакторов, я был уверен, что логика работы кода с анимацией будет примерно одинаковая, но впоследствии пришло понимание, что мы немного ошиблись в наших предположениях. Первое с чем мы столкнулись - разная работа с прозрачностью для bone у этих редакторов анимации. Если bone для анимации в CocoStudio достаточно было сделать прозрачными "на лету" для получения необходимого нам результата. То для Dragonbones такой вариант не подошел. В этом редакторе прозрачность bone устанавливается в анимации не зависимо, меняли мы ее в редакторе или нет. По этой причине было приято решение, заменять картинки областей контактов пустыми, после создания персонажа в уровне. Кроме этого, очередной особенностью работы с Dragonbones явилась необходимость дополнительной утилизации арматуры анимации из пула объектов. Логика обработки обратных вызовов при завершении анимации обоих редакторов тоже немного отличается. Также есть отличия и в обработке точек событий у CocoStudio и Dragonbones, которые необходимо было учесть. Так как в нашей игре есть превращения одного персонажа в другого, нам необходимо было реализовать это максимально незаметно. Т.е. к примеру, крокодил - Crocco, анимация которого выполнена в CocoStudio, теоретически может превратиться в льва - King`a, анимация которого уже будет выполнена в Dragonbones. При этом превращение может произойти в любой момент времени, независимо от того, наносит персонаж удар, отлетает в оглушенном состоянии или стоит задумавшись. Для этого нам необходимо запоминать текущую анимацию персонажа и кадр этой анимации. А далее для нового персонажа, после его создания, запускать запомненную анимацию с нужного кадра. И, конечно, в игре необходимо корректно рассчитывать пересечения областей hitbox`ов и hurtbox`ов. Учитывать при этом нужно взаимодействие персонажей с анимациями, имеющих разный размер, а также масштаб уровня момент удара. Для этого необходимо было создать следующие функции, которые возвращают результат, найдено ли пересечение областей при ударах персонажей друг по другу. Дополнительно в нашей игре будут использоваться двигатели для осуществления полета персонажей, чтобы проходить отдельные участки уровней и реализации возможных сражений в воздухе. Для этого нам необходимо было решить вопрос добавления анимации двигателя к одной из костей внутри анимации персонажа. В CocoStudio вопрос решался довольно просто, так как реализация нам давно знакома. Что касается Dragonbones, в демонстрационных примерах можно найти информацию, как заменить готовый слот. Но чтобы добавить новый пришлось разбираться и создать дополнительные функции класса. В результате проделанной работы, мы все также имеем возможность быстрого создания анимации различных объектов и персонажей привычным для нас инструментом.  На создание контента для игр уходит очень большое количество времени, которого у нас катастрофически не хватает. Но благодаря такому подходу, мы можем изучать возможности Dragonbones, не снижая при этом нашу продуктивность. Безусловно, не всем данный подход покажется правильным. В нашем случае, мы решили, что время, потраченное мной на создание кода, будет намного меньше, чем на изучение Dragonbones с нуля и полный переход на его использование.  Например, при создании прототипа какого-то игрового объекта (персонажа, оружия, бонуса или платформы) мы можем взять анимацию готового объекта, из выпущенной нами ранее игры. Использовать его для реализации необходимого функционала, а далее уже заменить этот объект новым. Другими словами, отказ от использования CocoStudio повлек бы за собой дополнительные затраты времени на конвертирование анимаций из существующей у нас базы, в анимации Dragonbones. Не смотря на то, что в России и странах СНГ разработчиков игр, использующих cocos2d-x, очень мало, я все же надеюсь, что данная статья окажется полезной коллегам, использующим его в работе, или тем, кто собирает начать им пользоваться. Я адекватно отношусь к конструктивной критике результатов своего труда. Поэтому обязательно прислушаюсь советам и замечаниям. На текущий момент еще остались наработки, которые я не стал описывать в данной статье. Они не подходят под тему использования двух редакторв анимации. Если материал про разработку на cocos2d-x, указанный в статье окажется интересным, я могу дополнить его дополнительной статьей. На мой взгляд, у нас накопилось достаточно хорошего материала при разработке этого проекта. В завершение приведу ссылку на страницу игры в Steam. В ролике можно увидеть геймплей с реализованным функционалом из статьи. Ссылка на продолжение