Як ми придумали і зробили свою першу гру на Android. Частина 1: Механіка гри

Всім привіт! Ми два новоспечених розробника мобільних ігор, колишні однокласники, випускники Казанського федерального університету, Айдар і Ед.

Айдар:«Історія нашої гри почалася з того, що мені приснився дивний сон. Він представляв собою комп'ютерну гру, де на квадратному полі синхронно пересувалися чотири білих кульки. Коли перший з них вирвався за межі ігрового поля, я прокинувся. На ранок я подзвонив Еду, а вже в обід ми зустрілися у дворі університету, де я працював».

Ед:«Який програміст не мріяв зробити свою гру? Влітку 2014-го у мене було багато вільного часу, і я з радістю вхопився за цю ідею. Тоді ми і уявити собі не могли, з якими труднощами ми зіткнемося».

Втім, на першому етапі ми були сповнені ентузіазму, все було легко і цікаво. Саме про нього ми і розповімо в першій частині статті.

Отже, на вході у нас була одна проста ідея — гравець одним рухом управляє чотирма героями.

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

Ед: «Недовго думаючи, в якості мови програмування я обрав Processing, так як на ньому легко створювати прототипи без попередніх налаштувань. Крім того, синтаксис Java дозволив нам без праці перенести логіку гри на Android за допомогою таких комбінацій, як Ctrl+C і Ctrl+V, але про це пізніше. Ми створили чотирьох героїв у вигляді білих кіл і змінювали їх координати з допомогою стрілок на клавіатурі».

Айдар: «Початкове положення героїв ми встановили в рівновіддалених місцях рівня, так як це виглядало симетрично і „чому б і ні?“. Згодом, ми вирішили, що буде прикольно, якщо кожен рівень буде починатися так само».

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

image
«На другий день Вони створили стіну. Так буде стіна посеред рівня, і так відокремить вона героїв від виходу».

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

image
Ігрове поле ми склали у вигляді шахової дошки розміром 11 на 11. Таким чином простіше зберігати і переміщати об'єкти. Наприклад, якщо герой знаходиться в лівому нижньому куті, то його координати — [0][0]. Щоб посунути героя на одну клітинку вгору, досить додати одиницю до значенню рядка: [0+1][0]=>[1][0]. Кожну клітину може займати тільки один об'єкт, з чого випливає природне запитання: «Що станеться, якщо два об'єкти опиняться на одній клітці?» Вперше над цим замислилися, тільки коли один герой уперся в стіну, а другий на нього наїхав. Так з'явилася одна з умов програшу: два героя на одній клітці взаємно знищуються.

image
Ще одна умова програшу з'явилося, коли ми створили елемент пастка — клітина, при попаданні на яку герой помирає. Пастку потрібно було зобразити як щось небезпечне і заборонене, тому, дотримуючись мінімалістичного стилю, ми вибрали червоний квадрат.

image
Ед:«Мені дуже подобається настільна гра «Роборалли», і особливо система конвеєрів, яка вносить елемент несподіванки, якщо невірно розрахувати свої дії. Конвеєри спрацьовують в окремій фазі ходу (після пересування героїв) і зміщують об'єкти за напрямом стрілки. В нашу гру ми привнесли щось подібне, назвавши це потоками».

Потоки мають дві основні функції:

1) Система ніпель. Вона пропускає в одну сторону, але не пропускає назад.

image
2) Потокова лінія. З допомогою неї герої, вороги і ящики (про них трохи пізніше) можуть кататися по встановленим маршрутам.

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

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

image
Коли ворогів на рівні досить багато, створюється ілюзія, що вони живуть своїм життям: катаються в потоках, безуспішно б'ються головою об стіни, гинуть в пастки або обіймах один одного, залишають цей світ через вихід і, як ніби спеціально (насправді немає), весь час намагаються вбити героїв.

image
Ед: «На одному з тестових рівнів вороги так дратували, що мені весь час хотілося їм помститися. Потрібен був інструмент, а точніше зброю проти них, якими могли б скористатися герої. Перебравши кілька варіантів, ми вирішили тиснути ворогів важкими предметами».

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

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

Варіативність проходження — це особливість гри, якої ми щиро пишаємося. Звичайно, більшість рівнів можливо пройти не замислюючись, але тоді замість двадцяти ходів вам може знадобитися сорок чи шістдесят. Так у грі з'явився стимул до повторного проходження — пошук найкоротшого рішення.

Ед: «Особисто для мене пошук оптимального проходження — це улюблена частина в грі. На самому початку розробки ми завели таблицю, де наші друзі, перші користувачі, ділилися своїми рекордами: за скільки ходів був пройдений рівень. Бити рекорди і потрапляти в цій список мотивувало нас грати далі».

Перед релізом гри нам знадобилося зібрати найкоротші проходження всіх рівнів, щоб видавати їх у вигляді платних підказок. Для цього ми запрограмували алгоритм перебору з обмеженнями, але він працював надто довго на рівнях з великою кількістю об'єктів. Коли час розрахунків перевищила кілька діб, ми вирішили скористатися краудсорсінгом (англ. crowdsourcing, crowd — «натовп» і sourcing — «використання ресурсів»). Якщо гравець поліпшував рекорд на одному з рівнів, то з допомогою Google Analytics ми отримували його рішення у вигляді послідовності ходів. Досвідчені гравці зазвичай шукають оптимальне проходження евристично, застосовуючи свої напрацьовані шаблони і уникаючи надмірних ходів. Таким чином, ми швидко поповнили базу проходжень, але, на наш подив, деякі гравці досі продовжують бити рекорди. Їх ми акуратно записуємо і оновлюємо в наступних версіях програми.

image
далі буде...

У наступній частині ми розповімо про те, як розробляли загадки і техніку проходження рівнів.
Джерело: Хабрахабр

0 коментарів

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