Введение Я думаю, что большинство из вас в детстве играли в фишки.
Помните эти маленькие кружочки с картинками? Они были на разные темы.
Лично я в них особо не играл, но все же поймал.
И тут пришла идея сделать такую игру на телефоне - на Андроиде.
Знания у меня были, опыт тоже, и я начал их реализовывать.
Расскажу немного об игровом процессе, и, конечно же, затрону технические моменты — куда же без них был бы хаб?
Суть игры
Идея игры довольно проста и не вызывает особых затруднений.Вам даются деньги и три фишки.
Ваша задача – пополнить свою коллекцию фишек.
Сделать это можно либо купив их в игровом магазине, либо играя с противниками – это основной способ.
Глобальная цель игры – собрать все фишки.
Их около пятисот, все они разделены на конкретные альбомы по темам.
Эти альбомы можно просматривать, отдельные фишки можно покупать/продавать.
Бывает, что вы выиграли уже имеющуюся у вас фишку — такие дубликаты можно продать и купить взамен новые.
Что ж, так вы пополните свою коллекцию фишек.
Особенности игры
Порядок нокаута определяется мини-игрой «камень-ножницы-бумага».Это, наверное, самая напряженная часть, которую я написал в этой игре.
В игре имеется несколько игровых режимов.
Вы можете играть против компьютера – своего рода одиночная игра.
Против вас играют 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 — да, вот что это такое.
Но в целом главных граблей удалось избежать.
Скриншоты
Какая игра без скриншотов? Вот некоторые из них:"
"
"
"
"
Заключение
Я многому научился в процессе создания игры, хотя это не первая моя игра.Я покопался в деталях libGDX — и скажу, что не разочаровался.
Я потратил много времени на оптимизацию игры и создание правильной архитектуры.
Побочный результат — я понял, какие места самые рутинные, и сейчас доделываю свой движок, где решил большинство этих проблем.
Я получил бесценный опыт работы с людьми – общения с менеджером, артистами и другими людьми.
В целом я чувствую, что за время написания этой игры уровень повысился.
Конечно, работа над ним еще не завершена - будут ошибки, которые нужно исправить, будут обновления (например, хочу онлайн-игру на четырех человек, больше шапок и т. д.).
На данный момент наступил период, который уже не для программиста - распространение и реклама.
Игра получилась довольно интересной, думаю не затеряется и даст о себе знать.
P.S. Если кого-то интересуют технические детали подробнее, на уровне кусков кода, пишите в комментарий/личку, поделюсь, я не жадный.
Теги: #libgdx #разработка Android #android market #caps #Разработка игр #Разработка Android
-
Все, Что Вам Нужно Знать О Rss
19 Oct, 24 -
Переполнение Умножения
19 Oct, 24