Як легко і невимушено написати гру за 2 роки

У цій публікації я розповім про мій досвід розробки 2D гри під Android, яка затягнулася на 2 роки і набрала 15 завантажень в Google Play. Також поділюся деякими думками з приводу розробки.



Передісторія

В один прекрасний день, коли на моїй машині весело працював Debian Linux, а я борознив простори каталогу конфігураційних файлів, попутно знищуючи свої нервові клітини, і до мене прийшла ідея відпочити. Як і належить поганих хлопців з поганим зором, я вирішив відпочити граючи в яку-небудь гру. Ледь побачивши скріншот гри Funny Boat, я зрозумів, що мені терміново необхідно зробити її клон на Android.

Скріншот гри Funny Boatimage

Розробка

Практично відразу ж почалася розробка гри. В якості ігрового движка я вибрав ще модний по тим часам AndEngine (мова java), так як мав деякий досвід роботи з ним. Проект отримав технічне назву "Light Rabbit". Через тиждень у мене був простий прототип. Я самостійно малював графіку і писав код, у зв'язку з чим перші результати лякали. Також у мене були проблеми з відображенням води і хвиль, але це вирішилося за день-два.

Прототип 01

Архітектура гри будується на використанні «сцен» (клас Scene) і деревоподібної структурі з них. Це найбільш зручний засіб розмежування коду в AndEngine. Сцена за своєю суттю є однією з вершин дерева, у неї є батько і безліч нащадків, є метод в який можна додати малювання об'єктів та обробку подій. Як показала практика, зручно мати кореневу сцену, до якої підключені всі основні сцени програми. Коренева сцена є своєрідним менеджером і дозволяє легко перемикатися між сценами враховуючи залежності і особливості окремих сцен. Саме від кореневої сцени всі події (наприклад, натискання на екран) розсилаються в нижчестоящі «підключені» сцени.

Ієрархія сцен у грі

Власне, на це і варто було зупинитися, привести все в порядок, додати меню, отримання монет і рейтинг. Але я не зупинився.

Додав зміну дня і ночі (і погоди теж!).





Додав систему юнітів з примітивним АІ, міцністю та іншими характеристиками. І вертоліт (а чому б і ні?). Режим «дружнього вогню» для юніта також регулювався за допомогою параметра світосприйняття (Нейтрали, Пірати, Імперці, Союзники, Вороги для всіх і так далі).





Додав систему діалогів. (І хай простить мене Олег Куваєв за налагоджувальні іконки)



Останні пункти змусили мене затягнути ліниву розробку ще на рік (!). Довелося серйозно змінити архітектуру гри, створити свою мову команд і сценаріїв на базі XML формату. Я навіть встиг випустити іншу гру за цей період.

Приклад уривка сценарію для другого рівня
<!DOCTYPE LRLevel>

<Level>
<Setting>
<Chapter>Глава друга</Chapter>
<Name>Повсякденність</Name>
<!>SEA</Zone>
<Weather>FAIR</Weather>
<DialogBase>DialogBases/level_01.lrdb</DialogBase>
<Fog colorR="20" colorG="20" colorB="20" colorA="255"/>
</Setting>

<Events>
<Event command="SET_WATER_WAVE_HEIGHT" arg_int="30"/>
<Event command="SET_WATER_WAVE_REPEATING" arg_int="20"/>
<Event command="SET_TIME" arg_int="6"/>
<Event command="STOP_TIME_IN" arg_int="21"/> 

<Event command="UNIT_ADD" id="0" arg_int="-600" arg_str="SteamShip" arg_str2="RIGHT"/>
<Event command="UNIT_SET_PROJECTILES_COUNT" id="0" arg_int="32"/>
<Event command="SET_DIE_POSITION" arg_int="-100"/>

<Event command="UNIT_SET_POSITION" id="0" arg_int="200"/>

<Event command="SET_FOG_VISIBLE" arg_int="0"/>


<Event command="WAIT_SECONDS" arg_int="2"/>
<Event command="SHOW_REPLIC" id="1" arg_int="2"/>
...


Звичайно, для написання сценаріїв в такому вигляді потрібен був редактор, якого зовсім не було. Спроби були, але обсяги роботи розросталися настільки, що я почав планувати реліз ще через 2.

Команди зчитуються з файлу сценарію і далі виконуються послідовно. Дуже хотілося додати умовний оператор, але обійшлося і без нього.

Агенти

Простих послідовностей команд виявилося не досить, і тоді, я придумав таку штуку як «агенти». Агент створюється командою, закріплюється за юнітом і стежить за виконанням якого-небудь умови, при цьому не затримуючи основний потік виконання команд. Після виконання умови, агент виконує дію і самознищується.

Наведу приклади агентів:

  • Вбивство юніта при досягненні їм певної позиції
  • Зміна поведінки юніта (припинення руху в певній точці, наприклад)

Опублікувати

Через значний проміжок часу у мене вийшов малосвязный сценарій, який розкинувся аж на 11 різноманітних рівнів включаючи навчалку. Я вирішив, що пора зав'язувати з зайнятися розробкою і публікацією.

За повчанням місцевих мешканців я зробив публікацію на сайтах slide.me і 4pda, і природно, на google play маркеті. Враховуючи свою аналітику та коротке кількість скачувань на slide.me (близько 400 завантажень) я роблю висновок або про накрутці, або про неможливість надходження даних з телефонів користувачів. За моїми даними з slide.me прийшло менше 5 установок.

Камінь в город 4pda

Після публікації в тематичну гілку форуму 4pda, моя тема провисіла дня 2 на перших сторінках, після чого просто зникла без будь-яких причин. Однак це принесло близько 10 установок.

Аналітика і вбудована реклама

В якості першого досвіду в гру була вбудована аналітика і навіть скромний банер з рекламою. Для розробника ігор на движку AndEngine вбудовування реклами є не зовсім тривіальним завданням на відміну, наприклад, від користувачів Unity.

Окремо хочеться сказати, наскільки я був вражений можливостями засобів відстеження дії і аналітики. При наявності інтернету можна було дізнатися про натисканні на будь-яку кнопку у грі, про те, скільки рівнів хто пройшов, а хто кинув друзі скаржилися на хардкорность).

Ще раз підкреслю, аналітика — це дуже корисно навіть для дрібних додатків.

Шалені гроші

Заробити з рекламного блоку мені вдалося майже 30 центів. Навіть графіки приводити не буду.

воводу AndEngine

AndEngine — відмінний 2D ігровий движок, який дає більшу свободу дій. Його можна легко розширювати своїм кодом, адже він є відкритим. Є купа прикладів, можна підключити фізику Box2D або використовувати шейдери для графіки. Є досить велика спільнота, що використовують його людей. Однак відчувається, що він почав застарівати (deprecated не рідкість), розробка зупинена (1.5 коміта в рік не вважається), і участь його в найближчі роки — движок для ознайомлення і невеликих ігор. Рекомендую не затримуватися і пересісти хоча б на LibGDX, а може бути і на щось більш високорівневе.

Вихідний код і більшість ресурсів

Це мій перший закінчений проект такого масштабу. Оновлюватися він вже не буде. Не шукайте там хорошого коду, однак деякі моменти реалізації (наприклад, клас води для AndEngine) можуть виявитися корисними. У файлі README присутнє посилання на Google Play для бажаючих помацати.

Посилання на репозиторій c кодом (Bitbucket).

Висновок

Якщо ви хочете, щоб ваші ігри грало багато народу, робіть їх простими, аналізуйте тренди, не кидайтеся в розробку без чіткого плану, найміть вже нарешті художника.

Якщо ви робите гру для себе — робіть що хочете.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.