Незвичний подарунок на Валентина — гра-головоломка. Як я створив пазл на Godot за 3 тижні та встиг до дедлайну
Привіт, спільното! Хочу поділитись незвичним досвідом розробки гри, яка є подарунком на Валентина коханій людині!
Напередодні свята, це були
Ідея
Спочатку я планував створити щось накшталт бродилки-головломки, де б треба було шукати якісь предмети задля певної цілі, але це б зайняло забагато часу (дедлайн був 3 тижні, а сюди ще додати відключення світла, щільний графік навчання та роботи і так далі), тому я вже думав відмовитись від ідеї гри і подумати над іншим форматом. Але саме в той день дівчина сказала, що дуже хоче пограти в пазл «Is this Seat Taken?».
Тоді і появилась ідея для жанру майбутнього подарунку — головоломка, де ключовим геймплейним елементом було б перетягування персонажів по сітці і враховування побажань кожного. Більше того — раз це гра-подарунок з тематикою стосунків, то одразу появилась ідея для ключового правила — персонажі мене та дівчини повинні бути завжди поруч.
Godot та ООП: інструменти та прототип геймплею
З інструментами я довго не думав — маю досвід лише з Godot. В ньому все і робив. Графіка (якої не дуже багато, десь до 20 спрайтів 16 на 16) створювалась в Aseprite нашвидкоруч.
Першим кроком було... ні, не аналіз наявних аналогів та дизайн ігри, UI тощо. В мене погано з софт-скілами та плануванням, тому я зразу пішов реалізовувати механіки гри, придумуючи їх на ходу. Зрештою, їх і так небагато, а часу було обмаль. Першим великим пунктом була реалізація кастмного Drag-And-Drop. Godot не має прям готового рішення «з коробки» для спрайтів, але готові засоби для роботи з Collision Shapes та мишкою має, тож мені треба було лише зробити машину станів для цього діла.
Оскільки нормального плану розробки все ще не було, то після реалізації центральної механіки управління я вирівши робити UI (бо чому ж ні?) :) Першим був зроблений прототип екрану проходження рівня, що виглядав як... прототип:
Прототип екрану перемоги
І ні, тут ще не було умови перемоги, їх я почав робити після самої панелі. Курс ООП з університету дав ясно зрозуміти, що краще такі речі як «персонаж» та його «побажання» тримати як окремі класи-моделі. Особливо сподобалось нарешті застосувати поліморфізм в грі, а не на лоабраторних. Абстрактний клас Rule мав лише базові методи для роботи з сіткою та метод check, який мав би перевіряти, чи правило виконане. А от вже всі його нащадки реалізовували цей check так, як їм треба. Така система була зроблена, бо я не хотів, щоб всі правила були примітивними «хочу бути поряд з...» , це було б дуже нудно.
Графіка, UI та магія шейдерів
Після реалізації прототипу геймплею треба було приступати до найстрашнішого: графіка та решта UI. Оскільки це подарунок для дівчини, то він повинен був бути милим, рожевим, красивим та цікавим. А я — перш за все програміст, а потім вже розробник ігор, і з малюванням в мене повна біда. Все, на що мені вистачало мотивації та часу були прості спрайти 16 на 16 по типу кота і якоїсь їжі, а от малювати фони і щось ще велике зовісм не хотілось.
Тому я вирішив вдатись до хитрощі «якщо я не можу це намалювати, я це згенерую». І ні, я не про ШІ, як ви могли подумати, а про шейдери, які малювали абстракті фони замість мене (космос, екран загрузки з пульсуючих ромбів) і тд. Загалом в грі десь 5 шейдрів, до яких входить крім базових речей по типу блюру та фільтрів повноцінні генератори фонів (на фото це фон головного меню, що водночас є екраном загрузки та ефект космосу):
Фон з пульсуючих ромбів, що генеруються шейдером

Проте найцікавішим шейдером став спрайт самої сітки, який динамічно підлаштовувався під розмітку кожного рівня:
Гіфка з демонстрацією шейдеру сітки рівня
На цей момент до Валентина залишалось півтора тижня, а в грі не було ні UI, ні рівнів, ні кінцівки, ні персонажів, ні готових ідей як таких — лише розмите бачення того, що може вийти. Було вирішено прискоритись і спринтами робити по одному великому шматку роботи. Першим під руку попалось головне меню, яке крім фону на той момент не мало нічого.
Щось конкретне про UI сказати важко. Єдине, що спадає на думку — це те, як я намагався зробити меню якнайбільш привабливим для клікання — в нижньому куті стоїть прев’ю геймплея, де можна одразу зрозуміти механіки, кнопки всіляко реагують на мишку, поява кожного елементу проанімована тощо. Як лице подарунку, головне меню мало захопити з першого погляду.
Головне меню гри
Рівні, система збережень та фінал гри
Наступним етапом було створення самих рівнів. Гра не мала бути довгою, всього
Процес дизайну рівнів
Насправді саме цей етап виявився найприємнішим. Придумувати нових персонажів та способи використання їх побажань сприймалось як виклик, а не робота. Тим паче я дуже люблю алгоритми на сітці. Я чітко розумів, що для приємної гри мені треба було декілька «класів» персонажів: хотілок (які завжди щось хочуть), бар’єри (персонажі, які або не хочуть мати сусідів, або сусідами яких ніхто не хоче бути), прості предмети, які залежно від контексту мають бути поруч з кимось та персонажі, які мають специфічні вимоги (бути в куті сітки, мати сусідів з двох протилежних боків). Особливо сподобався персонаж «гумова качка», біля якої інколи хотів бути мій персонаж, і який вимагав те, щоб його стиснули з двої протилежних боків дві інші сутності. Загалом процес останніх рівнів міг займати по годині дорогоцінного часу.
І так, до дедлайну лишилось 5 днів, а мені потрібно було: придумати чутливу кінцівку гри, відшліфувати UI, знайти звуки та музику, зробити систему збережень. Я почав з останнього, щоб зручніше тестувати рівні та майбутню кінцівку. Тут немає що сказати: простий конфіг-файл.
Звуки та музику я просто нагло брав з відкритих джерел. Не претендую ні на які права на них. Оскільки гра крутиться навколо UI та інтерактивність з мишкою, то більшість звуків це hover та click по кнопках, звук перемоги та помилки тощо. Це був досить нудний, але важливий етап для гри.
Хоч я і мав центральну задумку гри про те, що я і дівчина повинні бути поруч, я ніяк не міг придумати як візуалізувати це у кінцівці. Але якось о 3 ночі до мене прийшло осяяння: останній рівень мав розмітку у формі серця і мав багато варіантів проходження. Моєю задумкою було зробити скріншот рішення гравця, оформити його як стару фотографію з якимось чутливим підписом або монологом. Зрештою я так і зробив: на весь екран була фотка рішення останнього рівня, а знизу — мої щирі думки стосовно гри, дівчини та стосунків.
Кінцівка гри
Дедлайн, QA та результат
Як це інколи буває, проєкт рідко коли закривається в заплановані межі. До свята залишилось 2 дні, а мені треба було щільно протестувати все і замінити всі UI-прототипи на щось толкове. Я швиденько намалював текстури кнопок та панелів, застосував їх скрізь де міг та прийнявся тестувати все підряд. Паралельно зробив білд і надіслав друзям на оцінку (саме друзі і найшли більшість багів). Фінальний білд був зроблений 13 лютого о 23:12, за пару хвилин до дедлайну.
Дівчині подарунок дуже сподобався, від кінцівки пролила сльози радості :) Особливо відмітила те, настільки кнопки в меню responsive і які в грі круті звуки. Також сподобались спрайти мене і її, виконані в трохи кумедному чібі стилі. Проходження з моїми підказками зайняло заплановані 18 хвилин.
Вийшло, що ця історія отримала щасливий кінець: дедлайни виконані, задоволення отримано, а дівчина щаслива.
Після свята я виклав гру у вільний доступ на itch, тому всі охочі можуть попробувати зіграти в цю особисту і милу історію.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів