Pull to refresh

«Детский» геймдев или «Как я играл в инди-разработчика»

Reading time 6 min
Views 14K
Здравствуй, хабр и его обитатели. В этом посте я поделюсь с тобой прохладной историей о том, как я пытался создать Самую Настоящую Инди Игру в одиночку, и через что мне пришлось пройти, чтобы не бросить это неблагодарное дело на полпути, а также о том, что в итоге вышло.


Предисловие


Итак, начнем с того, что мне на данный момент мне 17 лет и я школьник. Многие перестанут читать уже после предыдущего предложения, мол «Очередная школота на моем хабре, что он тут вообще забыл?!», поэтому если вы все еще продолжаете читать — спасибо вам, постараюсь оправдать ожидания.

Начало начал


А началось все как обычно с Идеи. В сентябре 2011 года мне вдруг пришла в голову мысль, что неплохо-бы применить свои небольшие на тот момент знания java и написать какую-нибудь поделку на областной конкурс «Юный программист», а поскольку просто программки мне писать не хотелось, я решил написать игру. Но какую? У меня было множество идей, но все они упирались в одно — я совершенно не умел рисовать. Тогда я пытался вспомнить игры, построенные на простой, либо процедурной графике. Вспоминались Darwinia, Dyson(ныне Euphloria), да тот же Tetris, и в конце концов мне в голову пришла идея написать свой Crayon Physics Deluxe, с магнетизмом и нердами. Неплохая идея, надо сказать.

Вкратце геймплей игры я представлял себе так: как и в Крайоне игрок имеет шарик, уровень и некую конечную точку на нем, к которой этот шарик нужно провести. Разница лишь в том, что в Крайоне нужно было рисовать, а в своей игре я предполагал произвольное изменение физических законов мира так, чтобы они удовлетворяли нуждам игрока. Грубо говоря, захотели, чтобы F = ma стало F = mv и поменяли. Или g = 9,8 на g = m. Круто! Но сложно для игрока.

В итоге концепция свелась к тому, что у игрока есть набор из нескольких формул, которые он может применять к объектам на уровне. Каждая формула воздействует на одно из физических свойств объекта. Например, на первом уровне есть шарик, находящийся в невесомости, склон, а у подножья склона — финал уровня. Дана формула «ГРАВИТАЦИЯ». Решение элементарно — перетаскиваем формулу на шарик, он падает и катится вниз по склону, приводя нас к следующему уровню.


Разработка и первые версии


Естественно, самой сложной задачей было написание физического движка. Хотелось написать все самому, брать готовое не люблю. Яву я знал на довольно слабом уровне, до этого писал на ней только простенькую Tower Defence, сапера и несколько программок, а физику и вектора вообще практически не знал. Тем не менее, пытался сделать все сам. Когда не получилось, начал искать статьи. Статей нашел много, но все они были откровенно говоря неполные и помогли очень слабо. В итоге я нашел отличную статью, в которой был довольно подробный код (за исключением некоторых участков), все сурсы и скомпилированный пример. Идеальный вариант, за исключением того, что код был на Delphi. Но дельфи не хаскель, код я успешно перевел на яву за пару-тройку часов.

К моему счастью, все заработало и я принялся работать над геймплеем. Скоро я узнал, что пресловутый конкурс «Юный программист» уже не за горами и прислать работу нужно было до 1 октября. Учитывая, что начал я во второй неделе сентября, а на написание движка ушло две недели, у меня оставалась неделя на реализацию геймплея. Графику я сделал незамысловатую, как выразились зарубежные тестеры — «Old CAD style». В итоге за неделю я сколотил первую версию геймплея, в которой было даже меню и раздел помощи. Один рабочий день угробил на создание трех уровней — все в чистом блокноте, никаких редакторов я тогда еще не сделал. Название было придумано соседом по комнате (живу в общежитии), оно показалось мне довольно хорошо звучащим, хоть и практически бессмысленным — Spin Deluxe. Итак, 30 сентября в 23:59 я отправил первую версию игры на конкурс, не обращая внимания на то, что игрушка безбожно тормозила даже на моем eMachines E642G в режиме высокой производительности.

Скачать билд можно здесь.


Неудача за неудачей


Конкурс должен был состояться к в ноябре, как я помню. К этому времени я исправил множество ошибок, доделал интерфейс и меню, исправил баги. На моем ноутбуке игра больше не тормозила. Каково же было мое удивление когда принеся новую версию на конкурс я обнаружил, что игра все же тормозит и довольно сильно. Сильно это не помешало, у меня была идеальная презентация и представление в целом, мне даже не стали задавать вопросов, но эффект все равно был смазан. Да и к тому же игра до сих пор выглядела довольно сыро, из звукового оформления практически ничего не было — визуальное тоже хромало на обе ноги. В итоге получил второе место, что показалось мне довольно обидным, так как работа на первом месте была мягко говоря убогой и написана дилетантом. Могу из нее припомнить лишь то, что игра была написана на Visual Basic и для хранения внутриигровых данных использовала не оперативную память, а таблицу Excel на диске. Именно тогда я понял, что меня окружают дилетанты и решил идти своим путем.

Скачать билд для конкурса можно здесь.

Тем не менее, мне предложили участвовать в школьной научно-практической конференции, и я согласился. К тому моменту я серьезно поработал над интерфейсом и даже сделал редактор уровней, работа стала идти намного быстрее. iZucken написал первую музыку, а reAlien нарисовал иконку. Я также занялся оптимизацией с помощью профилировщика. Оказалось, моя ошибка была в том, что я использовал совершенно неверный способ отрисовки, поэтому отрисовка графики занимала 98% времени выполнения. Мое представление очередной обновленной версии вызвало восторг зала и обеспечила мне однозначное первое место.

Естественно, на научную работу моя поделка не тянула, поэтому в своем докладе я указал цель работы «Изучение языка программирования Java, как языка разработки игр». Притянул тему за уши белыми нитками, как говорится. Вероятно поэтому на городском этапе конференции я не занял вообще ничего, а первое место получил паренек, который сравнивал скорости различных типов подключения к интернету. Справедливо? Меня даже не отметили, в отличие от паренька, который написал гостевую книгу на PHP даже без простенького дизайна, в которой из тегов было только b и br. Я к тому моменту за месяц набросал на платном хостинге небольшой сайт с форумом, галереей и файловым архивом. Все это не к тому, чтобы поплакаться вам в жилетку, а к тому, что я в очередной раз получил серьезный минус к мотивации, что чуть не заставило меня в очередной раз все бросить. Вот такая у нас поддержка начинающим разработчикам.

Посмотреть сайт можно тут.
Скачать билд для конференции — тут.


Desura и все-все-все


В феврале я наткнулся на сервис распространения инди-игр Desura и мотивация вновь посетила меня. Создав страницу игры и залив скриншоты я получил отказ — мол скрины не очень, да и трейлера не было. В итоге я занялся серьезным улучшением графики. Корявое нечто теперь действительно превратилось в шарик, интерфейс был полностью переписан и изменен, стал менее громоздким, добавилась таблица рекордов и многие вещи, имеющиеся в серьезных проектах. Игра стала мало чем отличаться от финальной версии. За пару вечеров был сделан трейлер под специально написанную музыку. В итоге я получил долгожданный аппрув и огромный стимул работать дальше.

Итак, код игры был готов на 95%, осталось самое сложное — контент. Делать уровни упорно не хотелось. Хотелось получить их все и сразу, да так, чтобы не меньше сотни. Делал по 2-3 уровня в день. Иногда не делал вообще ничего. Фантазия упорно не хотела работать. В итоге однажды я сел на задницу и нарисовал в тетрадке 20 уровней. Потом еще 20. Пару недель затратил на реализацию и доработку концепций уровней. Разбросал их по главам, написал интро и аутро, добавил еще визуальных эффектов. Продукт приобрел практически готовый вид. iZucken написал еще несколько треков, которые успешно вписались в игру.

Релиз был запланирован на 4 апреля. Единственной моей ошибкой была — цена. Отчасти виноват был я, отчасти мой отец, подбивавший меня продавать ее дороже, чем я хотел. В итоге финальной ценой я установил сумму в $4.99. Дорого и опрометчиво. Купило всего пару человек. Снизил цену на 75% — стали немного покупать. Но все равно недостаточно, сказывался недостаток пиара, в котором я абсолютно не смыслю.

Как говорится — первый блин комом. Но в целом за эти полгода я приобрел бесценный опыт, многому научился на ошибках. Спасибо геймдеву за это!

Трейлер можно просмотреть здесь.
Страничка игры на Desura — тут.
Скриншоты — здесь и там.

Спасибо за внимание, до новых встреч!

UPD 1:

Heliki просил рассказать об оптимизации, которую я провел. Итак, самая значительная работа была проведена с графикой. Дело в том, что изначально я делал как-то так:

public class Graph extends JPanel{
     
     private Timer myTimer;

     // конструктор, создание таймера и прочее     

     public class paint(Graphics g){
         // отрисовка
     }
     
     public void onTimer(ActionEvent ae){
         repaint();
     }
}


Но этот метод был крайне медленным, уж не знаю почему. Более правильный метод использовал класс Canvas, как компонент для отрисовки и класс BufferStrategy для буферизации. Этот более низкоуровневый метод и позволил снизить время отрисовки.

Также я провел серьезную оптимизацию для класс Vec(простой двумерный вектор). Так как я большинство кода физического движка копировал из статьи, каждый метод класса Vec, будь-то add, sub, mul, div, normalize и т.д. возвращал новый Vec, что приводило к созданию миллионов объектов данного класса. Да, код был довольно красивый из-за возможного chaining'а, т.е. возможны были конструкции вроде

Vec toMove = pos2.sub(pos1).normalize().mul(speed);


В итоге на поздних этапах создания я сократил количество одновременно созданных векторов с полутора миллионов до тридцати тысяч (примерно), переиспользуя уже созданные объекты. Хоть это и не предел, результат был довольно внушительный, хотя и не сильно заметный для человеческого глаза.
Tags:
Hubs:
+143
Comments 123
Comments Comments 123

Articles