Історія розробки моєї першої гри

Все почалося з того, що я пограв у надпопулярну гру під назвою «Flappy bird». Все чудово її знають і описувати гру немає сенсу. Але одне сказати я все ж повинен: Flappy bird зачепила мене своєю простотою управління і складністю геймплея. Я міг грати в неї годинами підряд і раптом подумав — може зробити таку ж захоплюючу, але при цьому просту в управлінні та концепції гру? Це ж легко, роботи на 2 тижні, думав я. І так все почалося.

Про що? Про що робити гру? Ось які питання я задавала собі протягом кількох днів. Але пізніше мені прийшов на розум дуже цікавий і захоплюючий момент у грі Valiant Hearts. В одній сцені даної гри головний герой (солдат) біг під градом бомб і в певний момент йому треба було зупинитися, щоб не потрапити під вибух снарядів.

І ось я придумав геймплей і концепцію гри, а назва просте — Crazy Crazy. Тепер треба було почати створення цього шедевра.

image

Графіка
Я довго не міг вибрати потрібний графічний стиль для своєї гри. Бігав від одного до іншого. Але врешті-решт зрозумів, що цей стиль повинен бути простим у малювання (щоб не витрачати багато часу на створення текстур) і особливим. Я завжди любив якийсь контраст чорного, білого і червоного, що ідеально пасувала для моєї гри, тому вибір припав на стиль з даними відтінками.

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



Анімація була зроблена старим добрим способом, тобто вона була покадрової. Іншу я не вмію робити, тому і вибирати мені особливо не доводилося. У грі всього лише кілька анімацій: біг героя, зупинка героя, поява тіні від бомби, вибух бомби. Так що на її створення я витратив так багато часу.



А от зі створенням бомби вийшло трохи цікавіше: спочатку я намалював фашистський знак в середині її текстури для того, щоб там не було порожнечі. Але забігаючи вперед я вам скажу, що це було не найкраще рішення. При виставлення вікових обмежень, як в App Store, так і в Google Play, враховується даний пункт, так як ця символіка є знаком екстремізму в багатьох країнах.



image

Технічна частина
Ось я і приступив до написання програмної частини для своєї гри.

Спроба №1:
Я, як наївний маленький хлопчик, вирішив, що зможу написати гру з нуля з використанням OpenGl, з яким у мене вже був раніше досвід (писав невеликі ігри типу змійки). Але вже через 2 тижні програмування під Android я усвідомив мінуси свого вибору:
1. Потрібно було написати багато коду з чистого аркуша, на що пішло чимало часу.
2. Мені б довелося програмувати гру заново під ios, де потрібно ще знати Swift/Objective-C. На це пішло ще величезна кількість часу.

Тому я зрозумів, що дана схема не дозволить закінчити гру до початку літа, із-за цього мені довелося змінити тактику.

Спроба №2:
Тепер я нарешті усвідомив, що для швидкого створення гри під Android і iOS мені потрібен був багатоплатформовий безкоштовний фреймворк з невеликою кількістю функцій. І ось мій вибір припав на LibGDX. У ньому є проста і зрозуміла документація і він працює на Android, так і на iOS. Незабаром я натрапив на чудову статтю на Хабре "[LibGDX] Створюємо клон Flappy Bird — Гра Bird". З допомогою неї (спасибі перекладачеві статті eliotik) я зміг за 10 днів створити якийсь прототип своєї гри з текстурами і основним геймплеєм. Ніякого меню, виведення GameOver і музики там не було. Але мені сподобалася моя гра. Проста в управлінні, але і трохи хардкордная в геймплеї.

Спроба №3:
Начебто мені все сподобалося в грі та коді, але завдяки коментарю від 1nt3g3r в тій статті я зрозумів, що багато зробив неправильно і негарно. Не було початкового екрану, під час якого в іншому потоці завантажувалися текстури, була просто жахлива архітектура гри і ще безліч дрібних проблем. Я собі такого не міг дозволити, тому довелося переписувати гру, ґрунтуючись вже на західних статтях про libGDX.

Але в кінці розробки у мене виникли дві головні проблеми:

Підтримка різних дозволів екрану.
Дурний респаун бомб на карті.




Підтримка різних екранів
Як ви знаєте, на Android є така жахлива і в теж час прекрасна річ, як фрагментація. Спочатку я створював гру під свій планшет (Nexus 7 2013), хоча знав, що мені доведеться рано чи пізно додавати підтримку інших екранів в грі. Я думав так вирішити дану проблему: просто множити на певний коефіцієнт ширину і висоту текстур, але, на жаль, це не допомогло. На планшеті з маленьким дозволом відображалося добре, а ось на старому телефоні з екраном з 90-х не дуже. Тому я розділив віртуальний світ гри на 2 основних екрану (або viewport), які підтримуються в libGDX:

StretchViewport — екран, який розтягується на всю ширину та довжину реального екрану, при цьому не зберігаючи пропорцій. На ньому я розташував background-текстуру гри. Тобто хоч на iPad, хоч на моєму Nexus були видні на весь екран шпалери.

FillViewport — екран, який розтягується до певних розмірів у відповідність зі своїми пропорціями. В даному випадку я зробив віртуальний екран розміром 800/450, тобто співвідношення сторін 16 до 9. На ньому я розташував всі об'єкти ігрового світу. З-за своїх особливих характеристик він не займає екран повністю на деяких пристроїв (наприклад на Айпад), із-за чого з'являється така безглуздість, як вилітанню бомб з невидимої межі цього екрану (див. малюнок). Але зате геймплей на всіх девайсах однаковий і бомби летять на айфоне стільки ж часу, скільки і на nexus 7.



Респаун Бомб
З появою бомб все не так однозначно. Що взагалі там з бомбами? Та все просто: спочатку з'являється тінь, вона збільшується і темніє, в цей же час падає з неба бомба, а коли вона стикається з землею, утворюється вибух і тінь зникає. Саме вибух і вбиває персонажа.

Я кілька разів переробляв алгоритм появи бомб, але так і не прийшов до досконалості. Зараз я тобі все поясню.
Почнемо з того, як він власне працює:
1. Знаходимо рандомные X координати нової тіні від бомби в діапозоні віртуальної ширини екрана (800 пікселів) + 400 пікселів.
2. Перевіряємо координати нової тіні від бомби на те, щоб вона знаходилася на раніше заданому мінімальному відстань від інших тіней (саме тіней, а не вибухів бомб).
3. Якщо все добре з перевіркою, то з'являється нова тінь від бомби, а після і вибух.

Ось власне код (вибачте мене, він жахливий):

private boolean checkCollision(float bombx, float minderuction){
boolean good=true;
for(short i=0; i<bombs.size(); i++){
if(!bombs.get(i).getRocket().isHaveDamage()){
float curbombx = bombs.get(i).getShadow().getX();
int curbombwidth = (int)(bombs.get(i).getShadow().getWidth());
if(curbombx>bombx){
if(bombx+curbombwidth+minderuction >= curbombx){
good = false;
break;
}
}
else
if(curbombx+curbombwidth+minderuction >= bombx){
good = false;
break;
}
}
}
good return;
}


public boolean Generate(float minderuction, float minx){
boolean createbomb = false;
if(getRandomInt(2)==0)
if(bombs.size()<16){
float newbombx = getRandomFloat((float)(screenWidth+400));
if(newbombx > minx && checkCollision(newbombx, minderuction)){
CreateBomb(newbombx);
createbomb = true;
}
}
return createbomb;
}



Що ж не так? Цей алгоритм заснований на некерованому рандоме. Гравець може нудьгувати 5 хвилин з-за того, що бомби не заважають йому пробігати ігрове поле, а потім померти миттю з-за двох близкостаящих бомб. По ідеї можна збільшити мінімальну відстань між бомбами, але не все так просто. Це відстань було прораховано на основі довжини гальмівного шляху головного героя, а так само його ширини. І з-за його збільшення гра може стати занадто легкою -> нецікавою.



Випуск гри
Отже, розробка гри зайняла у мене приблизно 2 місяці (майже у пару тижнів вклався). Тепер настав час викладати гру в Google Play. Тут все дуже просто: зареєструвався розробником на сайті Google, заповнив всі поля в консолі, виклав скріншоти. Хоча мене здивувало те, що за нової системи вікових обмежень рейтинг моєї гри в США піднявся до 12+, але мені тут вже нічого не зробити. Після відправив додаток на обробку і перейшов до випуску гри в App Store.

image

Як ви знаєте, для розробки під потрібен iOS Mac. А у мене його не було (та й зараз немає). Тому мені довелося викручуватися. Я дізнався, що можна запустити піратську версію OS X на віртуальній машині в Windows. Цим я займався приблизно тиждень. Зміг встановити потрібну версію цієї ОС тільки з 7 рази. Програми на ній моторошно гальмували, тільки XCode викачувався і встановлювався близько 8 годин. Але пізніше, налаштувавши віртуальну машину, я зміг вичавити з неї не гальмуючу картинку (і то гра з фреймворком компилировалась приблизно півтори години).

Тепер треба було підключити Game Center і рекламу AdMob до iOS-проекту. Це не склало особливих труднощів, так як у мене вже був досвід роботи з Android додатком.

З налагодженням у мене виникли деякі проблеми. Виявилося, що для тестування своєї гри на iPad (який мені друг позичив для розробки) потрібно мати статус розробника. Я зайшов на сайт Apple, залишив потрібну заявку, відправив дані своєї картки і приблизно через 2 дні у мене компанія зняла гроші з неї, а ключ, який вони надіслали для активації облікового запису розробника, був неробочим. З цього питання я їм писав приблизно 5 разів протягом 2-х днів, очікуючи відповіді. Тільки на 3-й днів, коли я вже збирався остаточно заспамить їх підтримку, вони надіслали мені робочий ключ активації облікового запису розробника. Сама підтримка відповіла тільки на четвертий день, але це вже не важливо. (Зараз я подумую про те, що не треба було писати їм стільки звернень на підтримку.)

Гра була готова під iOS і тепер мені треба було її випустити. Скріншоти під різні діагоналі пристроїв для App Store я зробив за допомогою фотошопу, опис для гри мені допоміг перевести на англійську мій друг. Нарешті гра була відправлена. Спочатку попросив прискореної перевірки додатки від Apple, але вони відповіли, що і так дуже зайняті, і мені довелося чекати модерації гри 8 днів.



Ось, власне, і вийшла моя перша гра під Android і iOS. Я цьому дуже радий і сподіваюся, що вам сподобалася моя історія розробки під ці дві чудові ОС. Якщо буде цікаво ще дізнатися, я з задоволенням відповім на всі ваші запитання, а може бути, і новий пост напишу.

Дякую Tibr за допомогу в написанні статті.

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

0 коментарів

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