Как примерить корону

    Эта статья для тех, кому быстро надоедает играть в 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 марта и продлевать его я не собираюсь. Устал я жить далеко от родины…
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну, и что?
    Реклама
    Комментарии 43
    • +6
      Забыли тот 0.1% аудитории, который страстно жаждет сделать свою игру, но у кого за 10 лет ноль идей)
      • +4
        Своя игра начинается с вопроса «Как они это сделали?» и создания собственного клона чужого шлягера. Идея придет после 40 часов кодирования)
        • 0
          Интересно. Зачем им хочется её сделать?
          -быть как все?
          -игры других не устраивают, но не знают чем?
          -интересует сам процесс?
          • 0
            Процесс, конечно, и факт получения какого-то законченного осмысленного результата.
            • 0
              Почему бы тогда банально не начать делать простенький платформер, например? Результатом будет утолённое любопытство.
        • +6
          секс-пакман
          Когда ждать статью про создание этой игры?
          • +13
            Жду, когда мне стукнет 70 лет. Слишком возбуждаюсь.
            • +1
              А что, от пакмана в 70 лет уже не возбуждаются?
              • 0
                Говорят хвост перестаёт мешать
          • +1
            Как-то сумбурно вышло, если честно. Но гэги оценил.
            • +2
              Статья отличная!

              p.s. (шепотом) там я кликнул по стрелке вверх — стало тыща! :)
              • 0
                И правда тыща. Пойду выпью за твое здоровье!
                • 0
                  Пойду выпью за твое здоровье!


                  Алаверды :)
              • +3
                Про «луну» — не совсем слэнг, т.к. Lua это и есть «луна» на португальском :) Сами разработчики рекомендуют писать именно Lua (не LUA).
                • +1
                  Спасибо за расширение кругозора! По-португальски знал лишь слово бола.
                • +2
                  Еще о Corona PapaBubaDiop рассказывает в Подкасте
                  • +2
                    LibGDX думаю тоже достойный, пишем на Java/Kotlin, плюс в том что не нужно учить еще один язык.
                    • 0

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

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

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

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

                            Зато все, что не JS/Phaser, обеспечивает лучшую скорость и меньшие размеры на мобильных платформах ))
                        • +1
                          Об игровых фреймворках. Я писал на Haxe/Flixel, Java/LibGDX, JavaScript/Phaser.

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

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

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

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

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

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

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

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

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

                          • 0
                            Извольте подать мне ссылку на скачивание плагина для Lua к Atom.
                          • –2
                            нууу… неееет..!
                            имея такую задачу:
                            Цель — создать 2Д игру без затрат и головной боли на все платформы

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

                            … НА СВОЕМ ТЕЛЕФОНЕ!
                            и все что нужно уже тут: habrahabr.ru/post/340502
                            и что немаловажно, this made in Russia (ведь импортозамещение-то еще по-прежнему в тренде))
                            • +1
                              Привет евангелисту с КДИ)
                              Планируется ли у вас поддержка других языков, как через GDNative у Godot?
                              • 0
                                Привет, в Короне можно собрать проект и добавлять нативный код, если функционала движка не хватает.
                              • 0

                                Я что-то не понял. Всего три инструмента для разработки 2D игр? И в списке нет Unity? Я понимаю, конечно, что Unity это в первую очередь 3D, но с 2015-го, кажется 2D поддерживается официально, и только ради одного Assets Store стоит обратить внимание на эту платформу. Визуальному редактору нет равных, как мне кажется, и добавление 3D в двухмерных играх тоже изи. PapaBubaDiop если не сложно — почему даже не упомянули Unity?

                                • +1
                                  Для мобилок не очень. Тормоза. Много проблем со связкой webgl+мобильный браузер, если в сети игра. И весит много, если скачиваемое.
                                  • 0
                                    Unity — это супер-токарный-станок. Может все. Но легкую, отзывчивую 2D игру на нем сделать чрезвычайно сложно. Одна настройка, установка, обучение и обход граблей займет месяц. С выходом новой версии Unity- ад граблей повторится с вероятностью 90 процентов.

                                    Корона, кокос и дефолд — удобные напильники именно для 2Д игр. Полностью бесплатные! Что важно для бедных художников.
                                    • 0
                                      Полностью бесплатные! Что важно для бедных художников.
                                      У которых Мак (или винды). По крайней мере только их картинки я вижу на кнопке «Download» у «Короны».
                                  • +1
                                    Выше уже упоминали такой движок как LibGDX. А почему не он?

                                    Unity — это супер-токарный-станок. Может все. Но легкую, отзывчивую 2D игру на нем сделать чрезвычайно сложно. Одна настройка, установка, обучение и обход граблей займет месяц. С выходом новой версии Unity- ад граблей повторится с вероятностью 90 процентов.


                                    Ведь такого как Вы описали про Unity тут нет, мне кажется он(LibGDX) очень походит под описание легковесного движка для 2D игр.

                                    PapaBubaDiop могли бы Вы дать пару коментов на этот счёт?
                                    • +1
                                      Да, libGDX тоже достойный, только там ад с установкой и компиляцией под разные платформы. Я не справился.
                                    • 0
                                      В мире существует три популярных бесплатных инструмента для создания универсальных 2Д игр

                                      Есть еще Gideros, который превосходит Корону по всем параметрам.
                                      А с недавним открытием FB Instant, Corona сосет уже совершенно официально.

                                      Defold — движок оч.спорный
                                      Cocos — ну хз хз, язык Lua все-таки в разы приятней C++
                                      • 0
                                        Пользуйтесь gideros-ом, я только за. Что до короны, у нее свой путь развития. На этой неделе выйдет версия с поддержкой совершенно сумасшедшей аудио-библиотекой для Андроид. Каналы, микширование, звучание — Шнур отдыхает.

                                        FB в короне есть с двумя функциями 1) логин в игру через ФБ и 2) шаринг достижений

                                        Плюс готовится поддержка HTML5 — насколько легкими будут приложения — пока не знаю. Как будет готова — напишу.
                                        • 0
                                          PapaBubaDiop попробуй Gideros, тебе точно понравится. После Короны легко и быстро в нем разберешься, они оба на Lua, логика похожая.

                                          Могу перечислить несколько преимуществ:
                                          1) Приложения мгновенно тестируются на смартфоне по WiFi.
                                          2) Есть макро константы, макро функции, побитовые операторы, улучшения синтаксиса Lua
                                          3) Есть псевдо-потоки, потрясающе удобно во многих случаях
                                          4) Gideros по-настоящему бесплатный (Корона же ощутимо дорогая, ибо все равно придется платить по $200 в год за плагины Admob и UnityAds, без них никуда)
                                          • 0
                                            Вас понял, шеф!
                                            • 0
                                              PapaBubaDiop такое ощущение что тебя короновцы попросили эту статью опубликовать :)
                                              в последнее время видно как они активизировались, на ютубе у видеоблогеров обзоры заказывают :)
                                              • 0
                                                Они попросили попользоваться Короной, написать игру и статью.
                                                После чего предложили работу евангелистом.

                                                Но зарплату я еще ни разу не получил)
                                                Так что я пока не настоящий евангелист.
                                        • 0
                                          а почему Defold спорный?
                                          • 0
                                            afrokick его если попробуешь в нем поработать, то увидишь что его можно либо любить, либо ненавидеть :)
                                            с шифрованием непонятно что у них, скорей всего как у Короны слабенькое
                                            из Lua-фреймворков норм.шифрование только у Gideros

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

                                        Самое читаемое