Connect with us

Разработка

Кейс Omega-R: игра “Гоголь.Начало”

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

AppTractor

Опубликовано

/

     
     
[notice]Кейс студии Omega-R – разработка мобильной аркады для сериала “Гоголь”.  Ваши кейсы вы можете присылать на почту.[/notice]

Заказчик

«ТВ-3» — российский федеральный развлекательный телеканал, специализирующийся на сериалах, художественных и псевдодокументальных фильмах мистического характера.

Задача

Создать мобильную промо — игру к популярному сериалу “Гоголь.Начало” для iOS и Android.

ТВ – 3 — это канал с большой аудиторией. Нам было интересно сотрудничать с ними, а им было комфортно работать с нами, ведь за плечами нашей компании большой опыт в разработке мобильных игр, в том числе для таких брендов, как Mattel и DeNA.

Решение

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

Гоголь. Начало.
Гоголь. Начало.
Разработчик: От GPM RTV, OOO
Цена: Бесплатно+
Гоголь. Начало
Гоголь. Начало
Разработчик: ООО «ГПМ РТВ»
Цена: Бесплатно+

Гоголь. Начало.

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

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

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

Дальше — больше! Теперь наш герой Тарас Бульба, способный на героические поступки. Прическу изменили, бородку укоротили, а вот сила осталась богатырская.

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

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

Есть еще порох в пороховницах?

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

Черти: «Уж мы-то доставили сложностей этим разработчикам. Усатый не понимал, откуда мы наступаем, и мы всегда побеждали. Но разработчики не сдавались, именно из-за них ситуация стала меняться не в лучшую для нас сторону. Теперь Гоголь видел, откуда мы наступаем и бил точно в цель, отправляя нас в темноту. Но с нами заодно Вий. Стоит ему поднять веки, и писаке приходит конец!».

Н.В.Гоголь: «У меня были большие проблемы с головой! Когда я сражался с нечистью, я бил в одну сторону, а смотрел в другую. Если честно, это было очень неудобно! Дизайнерам пришлось очень много работать над моей особенностью, но в итоге я остался доволен».

Результаты

Через месяц после запуска мы получили:

  • 4 звезды на GooglePlay
  • 10 000 – 50 000 тысяч скачиваний на Android
  • 5 000 – 10 000 скачиваний на iOS
Комментарии
Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement
1 Comment

1 Comment

  1. Иван Кудзиев

    11.10.2017 at 16:50

    ведь за плечами нашей компании большой опыт в разработке мобильных игр ….

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

    ————–

    компания с большим опытом в разработке двухкнопочных аркадных игр с простым геймплеем… серьезно=)

You must be logged in to post a comment Login

Leave a Reply

Дизайн и прототипирование

Hyperion

Hyperion – встраиваемый в iOS-приложения плагин, помогающий контролировать верстку.

Леонид Боголюбов

Опубликовано

/

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

  

 

 

Комментарии
Продолжить чтение

Новости

Интересные материалы: 07.12

Лучшие материалы о разработке и маркетинге технологических продуктов.

Леонид Боголюбов

Опубликовано

/

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

Комментарии
Продолжить чтение

Программирование

Правила, которые я выработал по результатам 1000 code review

Леонид Боголюбов

Опубликовано

/

Во время работы в LinkedIn большая часть моей работы состояла из проверки кода. Были определенные ситуации, которые постоянно возникали снова и снова, поэтому я решил составить список, которым и поделился с командой.

Вот мои 3 (+1 бонус) наиболее распространенных правки, которые я делал во время code review.

Правка 1: Генерирование исключения, когда что-то идет не так

Обычно я видел такое:

List<String> getSearchResults(...) {
  try {
    List<String> results = // make REST call to search service
    return results;
  } catch (RemoteInvocationException e) {
    return Collections.emptyList();
  }
}

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

Если бы вместо этого API выбросил исключение, то наша система мониторинга немедленно подобрала бы его, обработала и мы ошибку исправили.

Во многих случаях возникает соблазн просто вернуть пустой объект после того, как вы поймали исключение. Примерами пустых объектов в Java являются Optional.empty(), нулевой или пустой список. Хорошим примером того, где это все встречается постоянно, является парсинг URL. Вместо того, чтобы возвращать null, если URL-адрес не может быть получен из строки, спросите себя: «Почему URL-адрес неправильно сформирован? Является ли это проблемой данных, которую мы должны исправить где-то выше?».

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

Правка 2: Использование наиболее конкретного типа

Это предложение в основном противоречит строгому типизированному программированию.

Слишком часто я видел код, подобный этому примеру:

void doOperation(String opType, Data data); 
// where opType is "insert", "append", or "delete", this should have clearly been an enum

String fetchWebsite(String url);
// where url is "https://google.com", this should have been an URN

String parseId(Input input);
// the return type is String but ids are actually Longs like "6345789"

Использование наиболее конкретного типа позволяет избежать целого класса ошибок и, в основном, является основной причиной выбора строго типизированного языка, такого как Java.

Внимание, вопрос: как опытные программисты в конечном итоге пишут плохой типизированный код? Ответ: потому что внешний мир не сильно типизирован. Есть несколько разных мест, откуда берутся строки, например:

  • параметры запроса и пути в URL-адресах
  • JSON
  • Базы данных, которые не поддерживают enum
  • Плохо написанные библиотеки

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

// Step 1: Take a query param representing a company name / member id pair and parse it
// example: context=Pair(linkedin,456)
Pair<String, Long> companyMember = parseQueryParam("context");
// this should throw an exception if malformed

// Step 2: Do all the stuff in your application
// MOST if not all of your code should live in this area

// Step 3: Convert the parameter back into a String at the very end if necessary
String redirectLink = serializeQueryParam("context");

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

Правка 3: Использование Optionals вместо null

Одна из лучших функций Java 8 – это класс Optional, который представляет собой объект, который может существовать или не существовать.

Вопрос на миллион долларов: какое единственное исключение имеет собственную аббревиатуру? Ответ: NPE или Null Pointer Exception. Это, безусловно, самое распространенное исключение в  Java и, конечно, ошибка, которая стоит миллион долларов.

Optional позволяет вам полностью устранить NPE. Однако его следует использовать правильно. Вот некоторые советы по работе с Optional:

  • Не надо просто называть .get () в любое время, когда вам надо использовать Optional. Вместо этого внимательно подумайте о том случае, когда Optional не представлен, и придумайте разумное значение по умолчанию.
  • Если у вас еще нет разумного значения по умолчанию, тогда такие методы, как .map () и .flatMap (), позволяют отложить это решение.
  • Если внешняя библиотека возвращает значение NULL, чтобы указать на пустой случай, сразу же оберните значение с помощью параметра Optional.ofNullable (). Поверьте мне, вы поблагодарите себя позже. Нули имеют тенденцию «всплывать» внутри программ, поэтому лучше остановить их в первоисточнике.
  • Используйте Optional как возвращаемый тип в методах. Это здорово, потому что вам не нужно будет читать javadoc, чтобы выяснить, возможно ли, чтобы значение было пустым.

Бонус: Использование Unlift методов, когда это возможно

Вы должны избегать методов, которые выглядят следующим образом:

// AVOID:
CompletableFuture<T> method(CompletableFuture<S> param);
// PREFER: 
T method(S param);

// AVOID:
List<T> method(List<S> param);
// PREFER:
T method(S param);

// AVOID: 
T method(A param1, B param2, Optional<C> param3);
// PREFER:
T method(A param1, B param2, C param3);
T method(A param1, B param2);
// This method is clearly doing two things, it should be two methods
// The same is true for boolean parameters

Что общего у всех этих методов? Они используют контейнерные объекты, такие как Optional, List или Task как параметры методов. Еще хуже, когда  возвращаемый тип является тем же самым (т.е. метод принимает Optional и возвращает Optional).

Почему это плохо?

  1. Promise<A> method(Promise<B> param)
    менее гибко, чем просто
  2. A method(B param)

Если у вас есть Promise <B>, вы можете использовать 1, или вы можете использовать 2 путем «подъема» функции с помощью .map. (т.е. promise.map(method)).

Однако, если у вас есть только B, вы можете легко использовать 2, но вы не можете использовать 1, что делает 2 гораздо более гибким вариантом.

Мне нравится называть это «неподъемным», потому что это противоположность общепринятому функциональному методу «подъем». Применение этих знаний делает методы более гибкими и удобными для использования.

 

Комментарии
Продолжить чтение

Новости

Интересные материалы: 06.12

Лучшие материалы о разработке и маркетинге технологических продуктов.

Леонид Боголюбов

Опубликовано

/

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

Комментарии
Продолжить чтение

Наша рассылка

Каждому подписавшемуся - "1 час на UI аудит": бесплатный ускоренный курс для разработчиков веб и мобильных приложений!

Нажимая на кнопку "Подписаться" вы даете согласие на обработку персональных данных.

Популярное

X

Спасибо!

Теперь редакторы в курсе.