War Droids. Немного о игре или трудности с которыми я столкнулся во время разработки
В общем, еще класса с 7го я заинтересовался программированием. И начинал я с программирования игр: свой убогий minecraft, клон doom, doodle jump, всякие tower defense и т.д. Использовал разные технологии в разных связках от Delphi и Canvas(дурачек был) до C++ и OpenGL. Еще в то время я мечтал, наконец, заставить себя разобраться в мобильной разработке, и вот, к третьему курсу университета я созрел.
Анализируя всевозможные среды разработки и фреймворки мой выбор пал на Xamarin. Все плюсы и минусы можно вычитать в интернете, мне нет смысла их все зачитывать, но сильно повлияло на мой выбор то, что это кроссплатформенное решение и в перспективе(как куплю iPhone и Windows Phone) я смогу один и тот же проект с минимумом изменений портировать на все мобильные платформы.
Теперь немножко о игре. Получилась смесь Flappy Bird и Defender. Игрок управляет высотой полета дрона, летящего слева направо с постоянным ускорением. Встречает случайно появляющихся противников, если сможет пролететь далеко то встретит босса(пока всего одного). Противников нужно отстреливать из пулемета и ракетницы, пока они не отстрелили вашего дрона. За пройденное расстояние и уничтоженных вражин игрок получает очки, которые потом можно потратить на покупки новых пулеметов и корпусов. Так же во время игры случайно появляются всякие бонусы типа замедления времени, регенерации здоровья, неуязвимости и т.д.
Добавлена таблица лидеров и достижения, так что игроки могут мерится письками рекордами.
Вот пару скриншотов:
Трейлер игры: ссылка
Теперь о проблемах:
1) Если разрабатываешь игру один, то тебе постоянно приходиться думать о контенте - текстурах, звуке, музыке. Можно купить, можно заказать фрилансера. Но у нас, студентов, денег нет, вот мы и держимся. А держаться надо за инструменты, облегчающие нашу жизнь. Например, для создания спрайтов в игре я использовал 3ds max и взяв материал Ink'n Paint я добился плавного перехода цветов, создающего эффект объема, и тонкой черной обводки вокруг дронов.
2) Пиар. Эта проблема вытекает из-за отсутствия финансов. Сейчас мой проект затерялся в пучине Play Market'a. Дай бог чтобы через полгода было хотя бы 1000 скачиваний. Я вынужден регистрировать в сторонних маркетах(ужасно убогих, типа яндекс.store, где мою игру "модерируют" уже неделю). Я вынужден писать статьи. Я вынужден постоянно думать не о разработке, а о том, как сделать так, чтобы игру заметили.
Технические проблемы:
3) java.lang.NoClassDefFoundError:
Failed resolution of: Lcom/google/android/gms/ads/internal/zzl;
В отчетах о тестировании эта ошибка вылазила случайно, я не мог понять в чем проблема. Гугл давал ответы из разряда: "переустанови пакеты, пересобери решение т.д.". Я понимал что это как то связанно с рекламой в проекте, а в частности c NuGet пакетом Xam.FormsPlugin.AdMobView 1.0.23, который мне пришлось использовать, так как при использовании официальных Xamarin пакетов у меня происходили несовместимости с целевой версией Android API 23 или вылеты по Java Heap Size(изменение ничего не меняло).
Решением стала замена пакетов:
Xam.FormsPlugin.AdMobView 1.0.23
Xamarin.Android.Support.v4 22.2.0.0
Xamarin.Forms 1.3.1.6296
Xamarin.GooglePlayServices.Base 25.0.0.0
Xamarin.GooglePlayServices.Drive 25.0.0.0
Xamarin.GooglePlayServices.Games 25.0.0.0
Xamarin.GooglePlayServices.Plus 25.0.0.0
на пакеты:
Xamarin.Android.Support.v4 23.1.1.1
Xamarin.GooglePlayServices.Ads 29.0.0.2
Xamarin.GooglePlayServices.Base 29.0.0.2
Xamarin.GooglePlayServices.Basement 29.0.0.2
Xamarin.GooglePlayServices.Drive 29.0.0.2
Xamarin.GooglePlayServices.Games 29.0.0.2
Xamarin.GooglePlayServices.Plus 29.0.0.2
Как видно пришлось долго и упорно подбирать версии пакеты вручную. А вот так эта проблема выглядела в консоли разработчика:
4) В игре была необходимость выводить полупрозрачные или окрашенные текстуры. То есть в шейдер нужно передавать саму текстур + цвет её окрашивания в RGBA формате.
При использовании различных функций смешивания:
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
и т.д.
на экране появлялись различные артефакты, от черного ореола вокруг текстур, до засветки текстур и полного отсутствия прозрачности. Вот тут, на старом скриншоте, видны темные ореолы вокруг текстур. Эта проблема портила даже восприятие игры: взрывы казались больше, пули и ракеты были плохо видны.
Решение:
Используем
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha);
Код фрагментного шейдера:
precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D texture;
varying vec4 v_color;
void main() {
gl_FragColor = v_color * texture2D(texture, textureCoordinate);
gl_FragColor.rgb *= v_color.a; //строчка исправляющая ошибку
}
Как было вычитано в аналах интернета, тут мы делаем "предумножение" альфа-канала.
Проблем на самом деле было гораздо больше...
Они были связанны с добавлением рекламы, матрицами поворота, прикручиванием Google Play Services, но все они решаются чтением документации и разбором механизма работы. И абсолютно нового я ничего более не напишу. Поэтому, пожалуй, я на этом закончу.
Всем большое спасибо за внимание, за орфографию не пинайте, я очень старался.
Баянометр ругается на пост о флаге Беларуси)
Страница Play Market: ссылка