Хабрахабр

Пять лет рабства

А о собственной многопользовательской игре? Задумывались ли вы когда-нибудь о собственной игре? Многие из вас хотели бы прильнуть к разработке собственного шедевра, где сливаются ваша многогранная фантазия и исключительный перфекционизм. Думаю, что да! Я вас понимаю и хочу рассказать свою историю этого увлекательного пути.

Предыстория

У меня еще не было компьютера, и я был очень впечатлен этой игрой на мобильнике, больше всего поражал открытый мир. Все началось еще в 2007 году, тогда появилась не похожая ни на что онлайн j2me игра по мотивам произведения Сергея Лукьяненко. Я втянулся и, несмотря на отсутствие каких-либо туториалов, быстро разобрался что к чему.

Желание узнать, как это работает, и случайность сподвигли на использование багов с последующими банами. Шло время, но интерес не угасал, уже было мало просто игры. Дальше окончание школы и выбор профессии «программист» дали толчок к разработке моего первого софта для получения выгоды в онлайн-мире.

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

А о чем наша игра?

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

Домашняя планета фракции Осеон

Захватив все врата, игроки получают доступ на вражескую планету. Планеты фракций защищены системой из 12 врат. Оказавшись в непростой ситуации, игроки оккупированной стороны получают резервные войска с параметрами на 1. Недостаточно просто телепортироваться через открывшийся путь, после этого необходимо захватить цитадель – главное здание планеты. 4 раза выше своих.

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

Бой с противником

Впрочем жестокий мир PvP игры имеет и другие интересные механики, начиная от обычной разработки богатых месторождений и заканчивая охотами на кладоискателей.

Прототип

В наш набор попали: Anthill, Netty, MySQL. Так как опыта создания ММО игр у нас не было, мы решили взять все, что плохо лежит. После большого количества проделанной работы мы столкнулись с кучей проблем: отсутствие редактора интерфейсов, микролаги карты при движении, ввод текста и много чего еще. Это были не совсем те технологии. В фулскрине игра смотрелась отвратительно.

Разработка шахты Прототип игры.

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

Лаги Прототип игры.

И после трех дней работы игры в ВК зарегистрировалось всего лишь 15 человек – люди не понимали, как играть. После года разработки, когда отступать уже было нельзя, мы все же доделали базовые механики игры, собрали редактор карт и решили, что настал момент испытать ее на людях.
Мы добавили игру в ВК (без каталога) и объявили о запуске в нашей группе, где было человек 100.
В это время в игре было непонятное управление с участием клавиатуры, оставалось много багов, а также слишком простые карты, которые имели всего два слоя (травка и деревья). И мы решили все переделать с нуля.

Скрины старой версии

Большой онлайн

Меню взаимодействия с игроками

Бой

Леха, все не то, давай сначала!

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

Из многих фреймворков самым привлекательным показался Starling, он имел похожий со стандартным флешем API, поддерживался Adobe, и можно было без особых усилий использовать уже имеющуюся графику. Новую версию клиента мы решили однозначно делать с отрисовкой графики через видеокарту. Но в последующем библиотеку практически полностью пришлось переписать и отказаться от атласов, анимация занимала много места и не могла влезть в атлас разрешенных размеров. Наконец-то новая версия работала плавно.
Для растеризации вектора на лету я взял Dynamic TextureAtlas Generator.

Карты

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

  • травка\земля;
  • камни\вода;
  • декорации размером с клетку;
  • декорации большого размера.

Это хороший подход, когда вместо трех слоев на заднем фоне рисуется один. Идея была такая, что первые три слоя рисовались в один битмап и отправлялись в видеопамять. При входе на локацию игра фризилась, поэтому было решено все тайлы заранее переводить в BitmapData и делать быстрый copyPixels. Но без проблем не обошлось: при переключении MovieClipa на последующий кадр для растеризации все предыдущие кадры должны отрисовываться. Вы, возможно, видели, как некоторые браузерки фризятся на старте при подгрузке ресурсов. Но при этом получался неприятный фриз при старте игры в момент растеризации большого количества кадров. Вот тут можно почитать подробнее, как это сделать.
Все карты имели один размер 20х16 квадратных тайлов размером 64px. Мы не хотели, чтобы наша игра была таким же инвалидом, поэтому я ограничил время отрисовки тайлов для каждого кадра. Таким образом, вес файла карты составлял 1280 байт. Данные карт записывались в файл в бинарном формате, где границы слоя были определены заранее и оставалось записать только номер кадра MovieClipа. Но позже формат был переделан в JSON, чтобы было проще работать с данными.

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

Редактор карт

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

Многообразие

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

Карта с туманом войны по бокам

Сервер

Некоторые начинали писать и тут же бросали, потому что становилось непонятно, что писать, а вникать же в тернии игровой логики было скучно. Занимаясь клиентом, мы параллельно искали серверного программиста, но было не так много желающих писать сомнительную игру без нормальной документации. С архитектурой сервера нам помог здешний умелец solver. Через некоторое время мы определили, что нужен специалист, который сможет спроектировать сервер на Java, и, если он в будущем бросит проект, я смог бы его дописать. Solver не стал исключением и через некоторое время покинул нас. Он, можно сказать, наставил нас на путь истинный: показал, как нужно делать сервер, и позаимствовал архитектуру из учебного курса Мэил.ру. Сейчас, оглядываясь назад, я в недоумении, почему мы не написали сервер на Akka? Еще через год усилий мне удалось написать всю основную игровую логику.

У нас на сервере, конечно, не 2 млн. Про архитектуру можно почитать тут — Архитектура сервера онлайн-игры на примере Skyforge, также можно найти лекции на Интуите. Никаких fibers (как в скайфордж) не используется, и наш сервер скорее всего получился менее читабельным. строк, но тоже достаточно много. Как только сервер был готов, мы запустили альфа-тест. Кстати, код, который использовался для не вытесняющей многозадачности в Skyforge те самые файберы, был опубликован много позже, когда у нас все уже работало.
Пока я занимался сервером и клеил логику на клиенте, художник доделывал недостающие детали, которые сразу попадали в клиент. В этот раз все было почти как надо, но баги и ошибки сервера приходилось исправлять еще долгое время.

Туда и обратно. Саморожденная игровая механика

Как бы вы назвали игрока, который специально делает неполную армию и проигрывает другим игрокам\ботам? Хочется вам рассказать про еще одну необычную вещь в игре. Они сливают опыт и понижают свой уровень намеренно, так они становятся сильнее на своем уровне. Мы называем их «сливы». Становится проще побеждать врагов высокого уровня и получать больше награду. Это важно, когда уровень игроков, на которых можно нападать, ограничен и дает им больше возможностей развития. Хотя это может показаться проще, чем классическая игра, но слив опыта требует от вас больше времени и умелую прокачку вверх изначально. Это как прокачать своего перса, но уже в обратную сторону. Повышать и понижать уровень можно бесконечно долго. Если понижать уровень слабому персонажу, то это не даст большого преимущества, и только подтянет игрока к среднестатистическому. Даже достигнув максимального развития для своего текущего максимального уровня, игрок может подняться на еще более высокий для доступа к новым технологиям и снова слить свой прогресс по опыту, оставаясь таким же сильным по технологиям.

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

Не получилось, не фартануло

Первую нашу заявку отклонили без объяснения, при повторной заявке нас все же добавили в каталог. В каталог игр ВК мы попали 4 февраля 2018 года, причем не с первого раза.

Прежде всего ошиблись с платформой: не каждый игрок готов проводить в браузерной 2D игре кучу времени, которое требует механика. Несмотря на большой срок разработки игры, все детали охватить не получилось, мы сделали множество ошибок. Наше обучение в игре, мягко говоря, не удалось. Многие люди привыкли к более простым и понятным играм, где больше фана с самого начала. После прохождения туториала игроки благополучно забывают, что там было, а возможно даже и не читают.
По статистике ВК у нас огромный отвал игроков, надолго остаются в основном только те, кто когда-то играл в ту старую игру и уже знаком с механикой.

48 недель спустя…

С этого момента я решил, что надо бы портировать клиент на что-то более живучее. Примерно через год после запуска альфа-версии стало ясно, что Flash скоро прекратит работу в браузерах. Этот Java фреймворк позволил не переписывать некоторую часть логики, а просто скопировать ее с сервера. Конечно, приятнее писать на знакомом языке, поэтому я выбрал LibGDX. Но есть и слабые стороны: отрисовка шрифтов, отсутствие живых визуальных редакторов интерфейсов и т.д. В нем есть хорошие абстракции для тайловых карт и реализация для Tiled, что позволило быстро написать код для наших карт.

На данный момент написан альфа-клиент под андроид, в котором реализовано 50% всех возможностей в игре.

Клиент игры для мобильных устройств

Если у вас есть желание что-то нарисовать или написать для мобильного клиента – пишите. Разработка все еще продолжается.

Отдельно хочу выразить благодарность звукорежиссеру Пересвету Муханову и композитору Артему Давыдову, они в небольшие сроки и очень качественно написали все, что можно услышать в игре.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть