Эта статья для тех, кому быстро надоедает играть в Angry Birds, 2048 или Lord of Rings и в чьих головах начинают зреть сценарии собственных игр. Я полагаю, на местном ресурсе таких индивидуумов не менее 95 процентов. Оставшиеся 5 процентов (скорей всего уже реализовавшие собственные идеи в виде приложений) могут пока погулять.

Знаете, еще 100 лет назад каждый приличный человек писал стихи. Сейчас каждый приличный человек пишет собственную 2Д игру. И самый главный вопрос — как быстро проверить играбельность своей идеи? Что увлекательней и рациональней — тыкать пальцем или кликать мышкой? Где сидят твои пользователи? На Андроиде или iOS-е? Под Windows, Linux или Mac? Каким инструментом пилить дерево познания?

Я проверил один из инструментов. Не исключено, что он может подойти тебе, приятель.

Как максимально быстро написать свою 2D инди-игру? Скажем, крейзи-домино или секс-пакман. Расскажу про собственный опыт.

Все начинается с обыкновенного телефона. В который звонят. Который с тобой в минуты ожиданий или одиночества. Разумеется, ты начинаешь делать игру под свой телефон. Забаву, в которую интересно играть именно тебе. Если у тебя iPhone (говорят, еще есть Андроид), то тебе надо

  • скачать Xcode с сайта Apple
  • изучить язык программирования Obj-C Swift
  • освоить iOS SDK

На все три пункта уйдет 30 минут + 30 дней + 30 недель твоей драгоценной жизни. Это, конечно, немного, но утомительно.

Однако, к тому времени, когда ты станешь профессионалом в iOS разработке, собачка может подрасти. Блондинка сменит брюнетку. Жизнь изменится. Тебе заново придется изучать Джаву, Эклипс или Андроид-студию. А это еще год жизни. Мало того! Тебе захочется приспособить свою мобильную игру под десктоп (как мне через 7 лет iOS разработки) — и снова давай! изучай! новый инструмент!, язык! и настраивай эко-среду!

Что же делать? Как быть? В чем сила, брат?

Вот мой ответ, читатель.

Цель — создать 2Д игру без затрат и головной боли на все платформы


Март 2018 года. В мире существует три популярных бесплатных инструмента для создания универсальных 2Д игр. Это

  • cocos2d
  • defold
  • Corona

Чисто филологически я выбрал Corona. Представьте, если бы я взял cocos2d?!

Тебя спрашивают: -На чем сидишь?
-На кокосе…

Звучит двусмысленно, даже криминально…
Defold — тоже что-то определенно старое. Definitely old)

В общем, я выбрал Corona и отчитываюсь о содеянном.
Есть еще один резон, почему я примерил корону, но об этом в следующей статье.

Установка окружения и среды разработки


Заняло 30 минут. Действовал строго по инструкции. Скачиваем SDK, затем любой из рекомендуемых текстовых редакторов (можно использовать свой любимый редактор) и плагин для редактора.

Я установил Atom. Это универсальный бесплатный редактор, которым я никогда в жизни не пользовался. К Atom-у установил плагин для языка Lua (подсказки, автодополнения). Да, все что вы будете творить в Corone, пишется на языке Lua. На сленге русских разработчиков — ЛУНА. По мне, это смесь php, python и swift. Несколько старомоден и очень рационален. Для тех, кто знает больше одного языка программирования — изучить новый не представляет труда. Достаточно бегло прочитать неплохие статьи на местном ресурсе.
Кстати, язык Lua чудесным образом вернул меня к воспоминаниям молодости. Лет 8 назад я загружал популярные игры из Appstore на свой Мак в виде *.ipa файлов.

Вы знаете, если *.ipa переименовать в *.zip и распаковать, то можно в 2 клика вытащить из чужого приложения все картинки и звуки. Так вот — распаковав знаменитый тогда Angry Birds, я, кроме картинок и звуков, обнаружил кучу файлов с расширением *.lua. Будучи полным невежей, я посчитал их за скриптовые файлы описания уровней игры и проигнорировал. Каково же было мое вчерашнее удивление, когда я узнал, что Angry Birds написан на языке Lua. И эти файлы — исходный код игры!

Создание первой игры


Любая мобильная игра состоит из 3-х действий

  1. движение *.png картинки по экрану
  2. издавание звуков-пуков при этом
  3. реакция картинки на нажатие пальцем экрана (можно палец заменить на мышку)

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

Итак, не отвлекаемся, а посмотрим, как реализуется на языке программирования каждое из 3-ех ключевых действий. Замечу, что на моем любимом Swift надо написать кода в 7 раз больше, чем на Lua.

Движение картинки по экрану


Исходный код состоит из двух строчек.

-- рисуем на экране картинку из файла, можно рисовать сразу в определенную позицию
bird = display.newImageRect( "Assets/bird_0.png", 72, 72 )

-- двигаем птичку в новую позицию за время 25 миллисекунд
transition.to( bird, { time=25, x=xNew, y=yNew } )

Издавание звуков


Исходный код состоит из двух строчек.

-- загружаем звук из файла
birdSound = audio.loadSound( "Assets/bird_shout.mp3" )

-- птичка заорала, переменная birdChannel в принципе не очень нужна
birdChannel = audio.play( birdSound )

Обработка нажатия пальцем экрана


Исходный код состоит не из двух строчек, все несколько старомоднее и длиннее.

-- регистрируем функцию в которую приходим при нажатии на экран
  addEventListener( "touch", onObjectTouch )

-- а вот и сама функция, куда приходим теперь при любом нажатии на экран
  local function onObjectTouch( event )
      if ( event.phase == "began" ) then
        selectedItem = selectCell(event.x, event.y)
        print( "Touch event on: " .. selectedItem )
      elseif ( event.phase == "moved" and selectedItem>0 ) then
            moveCell(selectedItem, event.x, event.y)
      elseif ( event.phase == "ended" ) then
        unselectCell(event.x)
      end
      return true
  end

Внутри функции код, взятый из моей первой игры, созданной при помощи Corona. На все ушло 12 дней (изучение Lua, Corona.sdk, работа с симулятором, прокрастинация и борьба с синтаксисом).

Итак, я почувствовал, что готов клепать игры с не меньшим энтузиазмом, чем на Swift.

Идея второй игры, сделанной на Lua, примерно следующая — на поле MxN набросаны цветные кубики со значениями кратными степени двойки. 2, 4 и так далее. Любые два соседних абсолютно одинаковых кубика можно схлопнуть в один. При этом значение нового кубика удваивается. Под действием силы тяжести кубики проваливаются в образовавшуюся дыру, а сверху падают новые случайные кубики. Надо набрать максимальное число очков, пока не закончатся возможные ходы.


Рис. 1 Скриншот эмулятора с игрой

Заключение


На проверку играбельности моей следующей игры под Corona ушёл один день, длинный, как карамель — по-моему, Corona очень и очень неплохой инструмент для быстрого прототипирования казуальных игрушек.

Я еще не проверил, как быстро я смогу выложить игру в три магазина (Appstore, Google Play, Mac Store) — это тема для следующей статьи, обещаю рассказать не только о процессе деплоя, но и о способах монетизации игр при помощи Corona.

Возможно, разработка под Corona станет моей новой специальностью.
Мой предыдущий югославский контракт закончился 1 марта и продлевать его я не собираюсь. Устал я жить далеко от родины…

Комментарии (27)


  1. VioletGiraffe
    16.03.2018 14:03

    Забыли тот 0.1% аудитории, который страстно жаждет сделать свою игру, но у кого за 10 лет ноль идей)


    1. PapaBubaDiop Автор
      16.03.2018 14:14
      +1

      Своя игра начинается с вопроса «Как они это сделали?» и создания собственного клона чужого шлягера. Идея придет после 40 часов кодирования)


    1. perfect_genius
      19.03.2018 09:55

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


      1. VioletGiraffe
        19.03.2018 10:29

        Процесс, конечно, и факт получения какого-то законченного осмысленного результата.


        1. perfect_genius
          19.03.2018 10:48

          Почему бы тогда банально не начать делать простенький платформер, например? Результатом будет утолённое любопытство.


  1. LoadRunner
    16.03.2018 14:13
    +1

    секс-пакман
    Когда ждать статью про создание этой игры?


    1. PapaBubaDiop Автор
      16.03.2018 14:15
      +3

      Жду, когда мне стукнет 70 лет. Слишком возбуждаюсь.


      1. LoadRunner
        16.03.2018 14:18
        +1

        А что, от пакмана в 70 лет уже не возбуждаются?


        1. domix32
          16.03.2018 15:16

          Говорят хвост перестаёт мешать


  1. DSLow
    16.03.2018 14:21

    Как-то сумбурно вышло, если честно. Но гэги оценил.


  1. JC_IIB
    16.03.2018 15:16

    Статья отличная!

    p.s. (шепотом) там я кликнул по стрелке вверх — стало тыща! :)


  1. Singlestep
    16.03.2018 15:32
    +1

    Про «луну» — не совсем слэнг, т.к. Lua это и есть «луна» на португальском :) Сами разработчики рекомендуют писать именно Lua (не LUA).


    1. PapaBubaDiop Автор
      16.03.2018 15:46

      Спасибо за расширение кругозора! По-португальски знал лишь слово бола.


  1. apps
    16.03.2018 18:13

    Еще о Corona PapaBubaDiop рассказывает в Подкасте


  1. igorperciuleac
    16.03.2018 18:13

    LibGDX думаю тоже достойный, пишем на Java/Kotlin, плюс в том что не нужно учить еще один язык.


  1. Goodkat
    16.03.2018 21:48

    А синтезатор голоса на айфоне можно использовать из Lua/Corona?


    1. PapaBubaDiop Автор
      17.03.2018 17:31

      В Corona можно использовать любые нативные функции, которых нет в SDK. Но это уже платформа-зависимые возможности.


  1. Zoolander
    17.03.2018 04:57

    мы с друзьями писали кроссплатформенные игры на HTML5. Движок Phaser 2.9 (третья версия все еще сыра), изготовление дистрибутивов под Андроид и iOS за счет PhoneGap/Cordova. Можно использовать облачный сервис build.phonegap.com, который позволяет быстро конвертировать репозиторий с Git в готовые дистрибутивы под мобильные системы.

    минусы по сравнению с другими подходами — больше тормозов, меньше совместимость (есть проблемы с Андроид ниже 5 версии — там родное WebView очень древнее, надо заворачивать в Crosswalk).
    Среди плюсов — получение самой быстрой и компактной веб-версии для десктопов.


    1. PapaBubaDiop Автор
      17.03.2018 17:33

      В этом квартале Corona начнет поддержку HTML5. Будет круто, я надеюсь. Быстро, бесплатно и без утомительной настройки окружения.


      1. Zoolander
        18.03.2018 05:00

        пока все, что не Phaser, создает HTML5-версии большими, тормозными и с недоработками

        Впрочем, в 2016 поддержка HTML5 у кроссплатформенных фреймворков была еще хуже.

        Зато все, что не JS/Phaser, обеспечивает лучшую скорость и меньшие размеры на мобильных платформах ))


  1. Zoolander
    17.03.2018 07:18
    +1

    Об игровых фреймворках. Я писал на Haxe/Flixel, Java/LibGDX, JavaScript/Phaser.

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

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

    — сложные элементы UI. Все, что предлагают вам из коробки игровые фреймворки — это максимум кнопки. А вам будут нужны списки, плавно реагирующие на мышку/тач/свайп. Это нужно для списков достижений, для апгрейдов, для магазинов, для найма войск. Да даже для таблицы рекордов — и то, по идее, было бы неплохо иметь список, который прокручивается. Я уже не говорю о списке выполняемых миссий, о встроенных системах помощи или списке настроек, который не помещается на экране.

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

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

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

    Поэтому совет: выбирая фреймворк — смотрите также на наличие плагинов/расширений к нему для списков (listview, recyclerview), на наличие хороших наборов для создания нормального интерфейса, а также на наличие визуальных редакторов сцен. Если всего этого нет (для LibGDX я так и не нашел редактора сцен), то готовьтесь к ручной реализации или планируйте очень простые интерфейсы (на 1 экран, без скролла, только на кнопках/нажатиях).

    Кстати, Defold, упомянутый в статье, имеет встроенный визуальный редактор. Учитывая, что язык в нем — тот же Lua, я бы посоветовал автору попробовать и его. Сам я в нем плотно не работал, но хотел бы увидеть чье-то мнение по поводу этого фреймворка/редактора. Когда я начинал (в 2015-16), Defold только начинался и многие вещи в нем были не реализованы, поэтому я не стал работать с ним. Но как я вижу, проект все эти годы развивался и там многое могло измениться.


    1. Zoolander
      17.03.2018 07:40

      Забыл добавить — вместо редактора сцен можно использовать Tiled (открытое бесплатное решение для визуальной верстки игровых уровней). В нем можно рисовать не только тайлами, но и объектами, что позволяет упростить верстку даже для UI.

      Поддержка Tiled есть практически у всех. Нужно только вручную добавить код для загрузки карты и ее конвертации в набор визуальных объектов.


  1. AGreenDog
    17.03.2018 17:34

    Извольте подать мне ссылку на скачивание плагина для Lua к Atom.


    1. PapaBubaDiop Автор
      17.03.2018 17:38

      На главной странице Getting Starting

      Atom autocomplete-corona

      Кликайте ссылку в таблице рекомендуемых редакторов


  1. walking_encyclopedia
    17.03.2018 17:38
    -1

    нууу… неееет..!
    имея такую задачу:

    Цель — создать 2Д игру без затрат и головной боли на все платформы

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

    … НА СВОЕМ ТЕЛЕФОНЕ!
    и все что нужно уже тут: habrahabr.ru/post/340502
    и что немаловажно, this made in Russia (ведь импортозамещение-то еще по-прежнему в тренде))


  1. exr
    19.03.2018 09:22

    Привет евангелисту с КДИ)
    Планируется ли у вас поддержка других языков, как через GDNative у Godot?


    1. PapaBubaDiop Автор
      19.03.2018 09:24

      Привет, в Короне можно собрать проект и добавлять нативный код, если функционала движка не хватает.