Создание космической браузерной игры. Первый опыт

В этой статье речь пойдет о первом опыте создания космической браузерной игры. О начальных шагах, первых результатах, о совершенных ошибках и наиболее интересных трудностях разработки, с которыми приходилось столкнуться. Мы будем рады, если читатели Хабра найдут в этой статье интересную для себя информацию.

В качестве вступления


Ранее, в течение последних 2-х лет, были попытки запуска некоторых браузерных игр малого масштаба, которые собирали менее 1000 игроков, но в этой статье мы их затрагивать не будем. Рассказ пойдет о первом опыте создания браузерной онлайн-игры, которая в будущем будет стремиться выйти в массы.

Идея создания космической игры родилась довольно давно. Почему космической? Отчасти потому, что космическая тема всегда вызывала мой личный интерес, а отчасти, по причине ностальгических воспоминаний от приятного времяпрепровождения за «Космическими рейнджерами», когда-то в далеком прошлом…

На чем писать?


Так как основной вид моей деятельности — это веб-разработка, выбор пал на HTML+JavaScript в клиентской части, и PHP+MySQL в серверной. Возможно, этот вопрос — тема бесконечных дискуссий, однако далее рассказ пойдет о разработке именно на этих языках. Конечно, Flash по части анимации куда более производительный, чем JavaScript, однако Flash не был выбран сугубо по причине нехватки знаний в ActionScript.

Серверная часть была написана с нуля — вероятно, не самое мудрое решение, однако хотелось пройти весь этот путь с чистой страницы index.php, написав собственный игровой движок.

Процесс разработки


Итак, начало положено. Придумана и написана краткая история игрового мира, повествующая о далеком будущем человечества, Федерации как главенствующего органа власти, войнах корпораций за планетарные ресурсы и заргах — крайне враждебной продвинутой цивилизации из глубин космоса. Разработана идея геймплея, основные функциональные возможности и принципы игры.Жанр
Все задуманные идеи неплохо умещались в создание эпической онлайн-игры с элементами RPG, стратегии, текстового квеста и аркады. Вопросы реализации основного игрового интерфейса решались около двух недель. За это время: 7 макетов, 4 варианта оформления.Интерфейс
По задумке, хотелось создать игру, требующей от игроков определенных умственных затрат (кстати говоря, до сих пор эта цель не считается достигнутой, и мы над этим работаем). Именно поэтому основной задачей было создание интерфейса максимально понятного и наименее нагроможденного.

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

  • Где есть возможность, тексты нужно заменить пиктограммами. Наглядные символы всегда воспринимаются проще;
  • Отказаться от вывода разного рода информации поверх локаций за пределами отведенных для этого блоков (убрать чат, уведомления, пояснения, задания, и выводить только в случае крайней востребованности) — в общем, максимально разгрузить рабочее окно, но вместе с тем оставить возможность перехода к нужной информации одним-двумя кликами;
  • Банально, но немаловажно: читабельный шрифт и адекватная цветовая гамма;

В результате родился такой вариант:

image

Главная информация располагается в верхней части экрана (уровень игрока, ранг, деньги, топливо, грузовой отсек), как и основные кнопки навигации (инфо профиля, события, дипломатия и прочее). Игровые настройки и справочная информация — в правом нижнем углу.

Однако, так как действие игры происходит не только в космосе, требовалось осуществить удобный переход между локациями. Именно поэтому была придумана центральная кнопка. Через нее осуществляется возвращение «на уровень выше» по логике взлета космического корабля с планеты вверх — в космос (если мы находимся в колонии — при нажатии на центральную кнопку, возвращаемся на поверхность планеты, с планеты — в звездную систему, из звездной системы — в открытый космос). Логика действия центральной кнопки сверху-вниз отображена на рисунке ниже:

image

В определенных локациях появляются дополнительные блоки, сверху или справа, в зависимости от того, какая часть экрана задействована под основной игровой процесс:

image

image

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

Итак, хоть мы и не располагаем штатом профессиональных гейм-дизайнеров и художников, минимальными силами нам удалось создать приемлемый интерфейс, который впоследствии оказался весьма понятен игрокам.

Написание кода
Первая версия игры писалась около 4-х месяцев. Зная, что со временем игра будет развиваться, функционал — расширяться, а соответственно, и увеличиваться количество кода, необходимо было на начальном этапе определиться с его архитектурой. Оказалось, это не так просто в виду того, что:

  • постоянно рождаются новые идеи, а следовательно, новые, более рациональные методы реализации этих идей;
  • текущий код оптимизируется и дописывается, что нередко влечет за собой переработку и реструктуризацию всего файла, а то и нескольких (просто, чтобы везде иметь единую логику, и в дальнейшем не запутаться);

Вышеизложенное применимо, по сути, к любому проекту, однако, как показала практика, при разработке игры эта проблема проявляет себя наиболее остро.

Исходя из этого, решение было довольно простым:

Все запросы клиента обрабатываются через один файл req.php, который в зависимости от получаемого GET-запроса подключает и выполняет нужные скрипты. Сами скрипты лежат в условной папке data/ и названы по принципу своего прямого назначения: planets.dat, solars.dat, colonies.dat, ships.dat, users.dat и т.д. Внутри этих файлов описаны классы и функции, разделенные по трем основным назначениям:

  1. Вывод данных игроку
  2. Создание/изменение/удаление данных
  3. Прочие общие функции движка (проверка данных, кэширование и т.д.)

Данный подход позволил свести к минимуму сложности в переработке структуры кода по причине расширения игровых возможностей: расширяются возможности кораблей — открывается файл ships.dat, добавляем новые типы планет — открываем planets.dat. Все изменения как правило выполняются в пределах одного — двух файлов, что позволяет ничего не забыть.

Подробнее о технических аспектах разработки я буду рад рассказать в следующих статьях. А сейчас перейдем дальше…

Запуск проекта


Итак, пилотная версия игры готова. Следующий вопрос — где запускать проект? Этот вопрос, разумеется, стал актуальным еще на стадии начала разработки. На самом деле, особых вариантов тут нет — либо это самостоятельная браузерная игра, либо это приложение в одной из социальных сетей.

Понимая, что бюджет стремится к нулю, а на рекламу игры нужны немалые вложения, было решено использовать ту площадку, где можно получить хорошую стартовую аудиторию игроков, и, желательно, бесплатно.

Выбор пал на ВКонтакте. «Контакт» с размещением в Приложениях предлагает играм неплохой старт, и достаточно лояльную аудиторию, готовую принять участие в тестировании и развитии игры, а также, готовую закрыть глаза на определенные недоработки и баги.

Чтобы попасть в каталог приложений, потребовалось:

  • изучить API ВКонтакте, внедрить некоторые социальные функции (авторизация, приглашение друзей, рейтинги);
  • арендовать сервер. Изначально был арендован средненький KVM VPS на процессоре Intel Xeon (4 CPU) с 4 Гб оперативной памяти и SSD диском;
  • приобрести и подключить SSL-сертификат (бесплатно можно приобрести на startssl.com);
  • подать заявку на модерацию;

И вот, спустя два дня после подачи заявки, модератор одобрил приложение, и оно появилось в каталоге.

Приложение в каталоге приложений ВКонтакте

Само по себе размещение в каталоге особо не приводит игроков, однако через неделю в приложении уже играли несколько человек.

Статистика приложения. Первые посетители

Ситуация в корне изменилась, когда приложение попало в блок «Новые».

Статистика приложения после попадания в блок Новых приложений

За первые сутки в приложение пришло около 6000 человек. В последующие — меньше, однако поток был довольно большим. В течение недельного размещения приложение установило около 15 000 человек (имеются в виду те, кто не удалил приложение после установки).

Первые серьезные проблемы


Упал сервер
В первую очередь, по причине нагрузки на базу данных. В принципе, это было ожидаемо, именно поэтому пришлось вдвое увеличить мощности сервера (до Intel Xeon 4 CPU и 4 Гб оперативки). И конечно, оптимизация, оптимизация и еще раз оптимизация...

Т.к. оптимизацию необходимо было провести в рекордно короткие сроки, чтобы не терять аудиторию, решения принимались очень быстро. Было переписано множество строк кода, в частности, касающихся запросов к базе. Частично нагрузку на себя взял CPU. Был упрощен вывод данных из базы: в определенных местах, где требовались сравнение и выборка из нескольких таблиц, ставили простые SELECT-ы из каждой таблицы в отдельности, а затем выводили необходимые данные посредством сравнения массивов на PHP. И все потому, что JOIN-ы требуют довольно много ресурсов (как оказалось позже, это неправда, поскольку скорость работы JOIN-ов напрямую зависит от того, насколько грамотно они оптимизированы, но времени на это не было, и мы решили переложить часть нагрузки на PHP).

Помогло! Работу приложения удалось стабилизировать. И хоть вопрос оптимизации до сих пор далеко не последний, эта проблема более не вставала так остро.

Баги, много багов...
Участники игры в ходе игрового процесса находили самые различные баги — от лежащих на поверхности, до самых немыслимых. Было очевидно: поскольку опыт в создании подобной игры фактически первый, багов будет очень много. Так и было. Кто-то писал о багах в группу игры, кто-то, понимая всю серьезность ситуации, писал лично, а кто-то по-тихому пользовался этими багами, накручивая себе деньги, либо иные характеристики. С последними было труднее всего, т.к. их было непросто отследить, еще труднее было сделать откат накрученного до адекватных величин.

В ходе работ, баги устранялись, игровой процесс «подтачивался» и становился более понятным и удобным. Большинство уязвимостей, конечно, не влияли на игровой процесс кардинально, никто не ломал базу, не сносил записи, однако небольшие недоработки как в коде, так и в самих правилах игры, позволили выявить еще одну серьезную проблему.

Дисбаланс
Это, пожалуй, одна из наиболее значимых проблем, с которыми могут столкнуться новоиспеченные разработчики игр.
Баланс необходим во всем. Иначе пользователям не интересно будет играть, либо сразу, либо в ближайшее время. Продумывать баланс необходимо заранее, на стадии подготовки к внедрению той или иной фичи в игру.

Первая наша ошибка была в том, что мы не учли один очевидный факт: игроки проводят в игре разное количество времени. И вот, один наш игрок проводил в игре около 5 часов в день. Через неделю его финансы выросли до девятизначного числа. Что он делал? Занимался торговлей. Находил планету, где один ресурс продавался дешевле, чем покупался на другой. Разумеется, опытные разработчики игр учтут этот момент в первую очередь. Для нас же — это было открытие.

После этого нами была прочитана масса литературы об игровом балансе (благо, информации об этом предостаточно), и мы поняли, что ему нужно уделять гораздо больше внимания.

Что дальше?
В качестве итога этой статьи, хочется отметить несколько наиболее значимых выводов, которые были сделаны с момента рождения идеи, до ее воплощения:

  1. Разработка игры — невероятно увлекательное занятие;
  2. Тестировать, тестировать и еще раз тестировать… В любом проекте тестирование и устранение багов занимают существенное количество времени. В игре — в три раза больше;
  3. Проработка игрового баланса — одна из основных задач при создании игры, которая должна закладываться на стадии формирования основных игровых возможностей;
  4. Мысль о том, что «я сам знаю, как должна выглядеть игра, которую я хочу создать» — верна лишь отчасти. Активные игроки и тестировщики могут внести значимый вклад в развитие игры. Не пренебрегайте общением с ними, желательно начиная с самой ранней стадии разработки;
  5. Вы должны быть целиком и полностью охвачены вашей идеей. Разработка займет очень много вашего времени. И чем меньше людей работают над ней — тем больше времени она от вас потребует;

Над проектом ведется работа более года (с некоторыми перерывами, поскольку требует личных финансовых вложений). Был проделан долгий путь, однако впереди по-прежнему много работы. Радуясь маленьким достижениям, совершая ошибки, мы движемся дальше, чего желаем каждому, прочитавшему эту статью! В конце концов, интересно, что из всего этого получится… :)

Буду рад рассказать в следующих статьях о технических подробностях разработки, о нашем подходе в реализации различных аспектов игры.

Спасибо за внимание!

© Habrahabr.ru