Возможности Для Android



Введение Я думаю, что большинство из вас в детстве играли в фишки.

Помните эти маленькие кружочки с картинками? Они были на разные темы.

Лично я в них особо не играл, но все же поймал.

И тут пришла идея сделать такую игру на телефоне - на Андроиде.

Знания у меня были, опыт тоже, и я начал их реализовывать.

Расскажу немного об игровом процессе, и, конечно же, затрону технические моменты — куда же без них был бы хаб?



Суть игры

Идея игры довольно проста и не вызывает особых затруднений.

Вам даются деньги и три фишки.

Ваша задача – пополнить свою коллекцию фишек.

Сделать это можно либо купив их в игровом магазине, либо играя с противниками – это основной способ.

Глобальная цель игры – собрать все фишки.

Их около пятисот, все они разделены на конкретные альбомы по темам.

Эти альбомы можно просматривать, отдельные фишки можно покупать/продавать.

Бывает, что вы выиграли уже имеющуюся у вас фишку — такие дубликаты можно продать и купить взамен новые.

Что ж, так вы пополните свою коллекцию фишек.



Особенности игры
Порядок нокаута определяется мини-игрой «камень-ножницы-бумага».

Это, наверное, самая напряженная часть, которую я написал в этой игре.

В игре имеется несколько игровых режимов.

Вы можете играть против компьютера – своего рода одиночная игра.

Против вас играют 3 противника, они играют сбалансированно – победить их в лоб вам не удастся.

Можно играть на одном телефоне с друзьями — они по очереди, получается как «горячий стул» в «Героях Меча и Магии».

И самый интересный режим — онлайн.

Есть сервер со списком игр, там можно играть с игроками со всего мира.

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

Все это прокручивается, все характеристики можно просмотреть в высоком разрешении.

Фанаты будут довольны.

Еще есть такое понятие, как биты.

Бита – это железный или пластиковый кружок, которым выбивают щепки.

В нашей стране биты не пользовались особым почетом (лично я не видел ни одной), но за рубежом их использовали.

Каждый бит имеет свои особенности, они влияют на процесс выбивания фишек.

Есть битовые суперспособности - при определенных условиях позволяет выбить все шапки в стопке.

Биты выбиваются вручную.

Она появляется на экране, хватает стопку кепок или биту и швыряет ею по столу — и выглядит это довольно неплохо.

Однако вы можете отключить руку в настройках.

Разумеется, имеется сертификат, в котором описаны нюансы игры.

Игра на двух языках - русском и английском.

Есть красивые вещи - крутящиеся биты, летящие звезды при покупке альбомов/фонов/битов, движущиеся надписи и тому подобное.

Есть система вознаграждений — например, за все собранные биты, за все открытые альбомы и т. д. В общем, в игре много еще интересного - просмотр больших картинок шапок (со скачиванием из интернета), разных фонов (тоже с ними мучился, ниже напишу почему).



Технические детали

Игра написана на Java, движок игры - libGDX (если кто не знает, позволяет вообще без проблем писать для десктопа, Android, с бубном - как для iOS, так и для html5).

Точнее, я построил свой небольшой фреймворк на основе libGDX и написал на нем.

Я написал еще несколько игр, используя тот же фреймворк.

Потом в нем обнаружились некоторые недостатки, и я начал его переделывать.

Сейчас этот мой новый движок почти готов, чуть позже опубликую о нем статью — там есть свои вкусности :) Среда разработки стандартная — Eclipse. В самом начале для создания проекта я использовал программу под названием libGDX UI Project Setup. Эта штука умеет создавать родственные проекты для Eclipse, закидывать в эти проекты нужные библиотеки и делать классы лаунчера для разных платформ.

Он может загружать последнюю версию libGDX из Интернета, а также поддерживает сторонние библиотеки.

Это отличная вещь, жаль, что сторонних библиотек почти нет(.

В результате работы программы мы получаем рабочую область, заходим туда Eclipse, импортируем проекты - и вот, у вас есть рабочий шаблон, который можно запускать на десктопе, на Android, в браузере (с некоторыми ограничениями).

Если у вас MacBook, можно попробовать на iPhone. У меня не было iPhone, тестировал на компьютере и телефоне.

Широко используется такая утилита, как GDXTexturePacker. Это упаковщик текстур — у вас есть много маленьких картинок, вы устанавливаете упаковщик на папку и получаете одну большую картинку (атлас текстур) со сторонами, кратными степени двойки (требования OpenGL к текстурам) и текстовый файл это описывает, где в этом большом файле находится какое изображение? Далее в игре вы загружаете этот файл и текстуру и получаете удобный доступ к картинкам.

Всем, кто использует libGDX и не слышал об этой штуке, очень рекомендую, вы сэкономите кучу времени.

Он позволяет сохранить в проект набор атласов, затем добавлять/удалять оттуда картинки - в целом автор хорошо поработал и сделал действительно достойный инструмент. Разработка шла следующим образом: вся игра была разделена на отдельные экраны.

Один экран — один Экран (класс libGDX).

Текстурные атласы делались по тому же принципу — один атлас на один экран.

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

Основная проблема Android — многоэкранность.

В libGDX есть класс Table — он позволяет неплохо с этим справиться, размещая компоненты не жёстко, а в ячейках таблицы.

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

В игре был один глобальный одноэлементный класс типа Game (это тоже класс libGDX).

Он хранил ссылки на все ресурсы, позволял переключать экраны, ловить моменты выхода/паузы/возобновления с паузы и т. д. Также он содержал код, специфичный для взаимодействия с Android. Это касается рекламы AdMob – показ/блокировка показа и Tapjoy. Был написан интерфейс для связи с Android. Этот интерфейс был реализован в проекте Android с использованием специфичных для него вещей.

Этот интерфейс был перенесен в игру из андроид-проекта.

Потом игра его вытащила, и андроид выполнил необходимые команды.

Для настроек был создан такой же синглтон — я назвал его умным названием GameSettings. Там я сохранял состояние плеера, и, собственно, настройки — звук/музыка и т.д. Сам плеер перед сохранением сериализовался в json-строку, а при загрузке десериализовался из него.

Это оказалось очень удобно — добавление нового свойства плееру не требовало перехода в режим его сохранения/загрузки.

Каждая фишка имеет свои свойства — картинка, цена, альбом и т.д. Эти свойства также хранятся в отдельных json-файлах.

В результате получилось около 500 json-файлов.

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

Понятно, что редактирование этих файлов вручную было бы напряжно - написан простой редактор фишек - можно было выбрать картинку, указать альбом\стоимость чипа.

В общем, в json-файлы я поместил всё, что можно — те же биты, фоны.

Я не люблю вникать в код без надобности — я ленив.

Таким образом, добавление/удаление битов, фона, фишек – это операции с файлами.

Автоматизация, однако.

Для сборки apk и компьютерной версии я написал ant-скрипт. Собирает апк, подписывает, собирает версию для компьютера и кидает все это в папку дропбокс.

Проходит немного времени и мои друзья запускают и тестируют игрушку.

Скрипт сборки Ant бесценен, если вы часто выпускаете релизы (а поскольку я работал удаленно, он мне очень, очень нужен).

Большую часть времени игра запускалась на компьютере, а потом запускалась на телефоне.

Это неоценимое преимущество libGDX — вы можете очень быстро отладить игру, не дожидаясь ее загрузки в эмулятор/устройство.

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

Была и монетизация.

Рекламный баннер Admob отображается в нижней части экрана.

Еще я разобрался и интегрировал Tapjoy — если кто не знает, это система, в которой пользователь получает виртуальные монеты за выполнение заданий (например, установку приложений из Google Play).

И тогда вы даете ему возможность потратить эти виртуальные монеты.

Например, я просто конвертирую их во внутриигровые монеты.



Возникшие проблемы

Не без проблем.

Первая проблема — онлайн-игра.

Сначала я хотел сделать вот так.

Выбираем одного игрока и делаем его сервером.

Остальные игроки отправляют/отправляют ему команды.

Он управляет всеми игроками и собой одновременно.

В этой версии серверная программа только контролировала создание игры и отправляла команды между игроками, уведомляя о создании/удалении игры.

Все бы ничего, но на практике оказалось, что такая реализация очень напряжна (ну мне так показалось).

Реализовать в одной программе одновременно и клиент, и сервер не очень получилось; затем мне пришлось добавить сервер.

На будущее я для себя понял, что задач на сервере много не бывает. Если можно что-то реализовать на сервере, делайте это на сервере.

Это не говоря уже о безопасности.

Вторая проблема — загрузка больших фотографий микросхем из Интернета для просмотра.

Они хранились в формате jpg. Изначально каждая картинка была размером 400*400 — или что-то в этом роде.

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

Оказалось, что на некоторых устройствах не загружаются картинки, а показывается только белый экран.

После танцев с бубном сжал все картинки до 512*512 - проблема исчезла.

Была проблема: игра тормозила и вылетала.

Проверка показала, что создается и удаляется очень много (около сотен) объектов токенов.

Сначала сборщик мусора это терпит, а потом игра начинает лагать и вылетать.

Решение — использовать пулы.

Вызов new Chip() (да, я так назвал чип) происходит только в одном месте — в диспетчере чипов, также известном как пул чипов.

После использования фишки возвращаются в пул.

То же самое делается с битами, фонами — запихиваем все это в пул, потом возвращаем.

Еще была такая проблема, как правильное отображение фонов.

Если просто растянуть его на весь экран, то при некоторых разрешениях получается очень некрасиво — например, круглые элементы становятся вообще не круглыми.

Решение — вырезать необходимые элементы из фона и разместить остальную часть изображения на весь экран.

Расставляем элементы по своим местам с указанием относительных координат. После этого проблема исчезла.

Широко использовался шаблон «слушатель».

Он соединил всё и всех.

Например, когда игрок выбивал все фишки, на экране отображалась награда.

Такая же награда должна была отображаться на экране статистики после игры.

Решение состоит в том, чтобы создать класс писателя, который мы извлекаем, когда вознаграждение получено.

Отдельные экраны — это абоненты.

Таким образом, добавление чего-то еще (например, денег на вознаграждения) означает создание нового подписчика и запись его на необходимые события.

В принципе, описанные выше проблемы я успешно преодолел.

Были и такие, которые я не смог решить - долгая (ну слишком долгая) загрузка игр на некоторых телефонах.

Фрагментация Android — да, вот что это такое.

Но в целом главных граблей удалось избежать.



Скриншоты

Какая игра без скриншотов? Вот некоторые из них:

Возможности для Android

"

Возможности для Android

"

Возможности для Android

"

Возможности для Android

"

Возможности для Android

"

Заключение

Я многому научился в процессе создания игры, хотя это не первая моя игра.

Я покопался в деталях libGDX — и скажу, что не разочаровался.

Я потратил много времени на оптимизацию игры и создание правильной архитектуры.

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

Я получил бесценный опыт работы с людьми – общения с менеджером, артистами и другими людьми.

В целом я чувствую, что за время написания этой игры уровень повысился.

Конечно, работа над ним еще не завершена - будут ошибки, которые нужно исправить, будут обновления (например, хочу онлайн-игру на четырех человек, больше шапок и т. д.).

На данный момент наступил период, который уже не для программиста - распространение и реклама.

Игра получилась довольно интересной, думаю не затеряется и даст о себе знать.

P.S. Если кого-то интересуют технические детали подробнее, на уровне кусков кода, пишите в комментарий/личку, поделюсь, я не жадный.

Теги: #libgdx #разработка Android #android market #caps #Разработка игр #Разработка Android

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.