Мобильная разработка с Corona SDK

Здравствуйте!

Захотелось поделится своим опытом работы с Corona SDK — средством кроссплатформенной разработки для Android/iOS от Ansca Mobile (основатели компании в прошлом работали в Adobe над Flash Lite). Статей здесь про него не так много, хотя движок один из самых популярных и не без причины. Corona SDK предназначен прежде всего для разработки игр, но нем можно писать и бизнес-приложения — для этого в движке есть набор UI-компонентов со сменными стилями. Главным преимуществом движка является значительное увеличение скорости разработки для опытных программистов, а также снижение технического барьера для новичков в мобильном gamedev’е. Продолжение под катом…


Я долго хотел попробовать себя в мобильной разработке, без особого желания учить Objective C или Javа и новые большие фреймворки. Хотелось использовать уже имеющийся опыт веб-разработчика. Про Corona SDK я узнал не сразу, и до него пробовал Appcelerator Titanium, Sencha Touch, JQuery Mobile и PhoneGap. Все эти средства, однако, не обеспечивают достаточной стабильности и быстродействия, особенно на Android. Из них связка Sencha Touch + PhoneGap является самой законченной, но все же не production ready. Итак…

Достоинства и недостатки


Плюсы Corona SDK:

+ разработка на простом и элегантном динамическом языке — Lua
+ симулятор позволяет видеть сделанные изменения моментально
+ простота настройки рабочего окружения (достаточно скачать симулятор и использовать редактор кода на ваш вкус, компиляция происходит на удаленном сервере)
+ компактный и интуитивный API
+ качественная документация от разработчиков движка
+ большое и активное сообщество разработчиков (количество бесплатной помощи действительно огромно и это очень помогает на начальных этапах + стимулирует помогать новичкам, когда сам уже что-то знаешь)
+ стабильность и скорость движка
+ быстрое исправление ошибок разработчиками — у многих это самое слабое звено (например, с Titanium Mobile мои баг-репорты висели в баг-трекере месяцами, с Сorona — от пары дней, до пары недель)

Минусы Corona SDK:

— лицензия $200-350/год (все вышеперечисленные средства бесплатны)
— невозможность подключать сторонние библиотеки, написанные не на Lua (скажем, модуль издателя игры или баннерной сети)
— критичный к быстродействию код все равно придется писать на Lua, если нет соответвующей функции в API движка, или искать обходные пути (они, как правило, есть)
— некоторые различия в функционале версий для Android и iOS (например, платежи внутри приложения поддерживаются пока только на iOS)

Pyro Shelf

Моим первым проектом стала игра-головоломка наподобие Bubble Blast. Т.к. разработка с Corona чрезвычайно проста, самой большой трудностью был дизайн. Все пришлось рисовать с нуля. Денег на дизайнера у меня не было. Поэтому на эту часть смело ушла половина всего времени работы над проектом. Подумайте о дизайне в первую очередь! Потом будет намного легче.

Другая трудность — поддержка разных разрешений экрана. Графику для каждого разрешения приходится делать отдельно, учитывая масштаб и соотношения сторон. Почему нельзя сделать графику один раз в hi-res, а потом только масштабировать ее в зависимости от того на каком устройстве запущенно приложение? Дело в том, что объемы текстурной памяти у устройств с небольшим разрешением экрана существенно меньше, да и максимальное разрешение текстур тоже (актуально, если вы используете спрайты для анимации). Поэтому есть смысл выпусть сначала версию приложения для iOS — всего два разрешения с одинаковым соотношением сторон (или три, если брать и iPad). С Android сложнее не только в этом плане. Судя по отзывам разработчиков, монетизация приложений, как платных так и бесплатных, намного легче на iOS. И после успеха на iOS, вам будет проще заявить о себе на Android.

Вспомогательные средства


В разработке мне очень пригодилась небольшая утилита TexturePacker, позволяющая автоматически создавать sprite sheets и Corona-код для них из отдельных картинок, с масштабированием, триммингом и многоими другими опциями. Просто не представляю, сколько времени я бы потратил задавая координаты и размеры каждой картинки в sprite sheeet вручную.

Sprite Sheet

Тот же разработчик делает другую полезную утилиту — PhysicsEditor, автоматически создающую код для физического движка Box2D, используемого в Corona. Каждая из программ стоит $20 (или $35 за bundle), но сэкономит вам не один час времени.

Вообще, для Corona сторонними разработчиками было создано множество различных средств, самые популярные из которых можно посмотреть здесь: www.anscamobile.com/corona/tools/?ref=nav

Весь код писался в IntelliJ Idea Community Edition c Lua плагином (оба бесплатны). После того как было перепробовано множество различных редакторов я остановился на этом. Разработчик проделал великолепную работу на плагином. Дополнение активно развивалось прямо на моих глазах, этим летом. Была добавлена поддержка дебаггера, модулей, рефакторинга и многих других вкусностей. А интерграция с IntelliJ Idea добавляет еще больше. Однажды я случайно удалил папку с проектом, а последний бэкап был сделал неделей ранее. Благодаря функции Local History в Idea, хранящую историю всех изменений, мне удалось восстановить проект, когда я уже ни на что не надеялся.
Для тех кто не любит пользоваться IDE, есть множество легких редакторов, самым удачным из которых, на мой взгляд, является вот этот SciTE bundle for Lua от российского разработчика.
Но использование IDE вполне оправдано. У меня в проекте было несколько сотен файлов — чуть более пятидесяти с кодом (половина из которого была автоматически сгененирована TexturePacker), более сотни — с картинками, остальные — уровни. Также, поиск по проекту — очень удобная и полезная функция Idea. Даже одна функция подстветки областей видимости переменных многого стоит!

Монетизация приложения


С Android у вас есть две опции — либо продавать свое приложение, либо использовать рекламу. С iOS добавляется еще возможность использовать in-app purchases. В качестве контент-провайдера для рекламы используется InMobi — второй крупнейший мобильный ad-network после AdMob. Буквально на днях Ansca Mobile заявила от сотрудничестве с inneractive, что должно дать возможность использовать любые баннерные сети для монетизации. Правда, для AdMob уже давно существует неофициальный хак (http://developer.anscamobile.com/forum/2011/10/17/admob-helper-module), использующийся, например, в такой известной бесплатной игре, как Blast Monkeys. Из моего собсвенного опыта, и у AdMob и у InMobi очень плохой fill-rate в некоторых странах, в том числе и в России. К счастью, AdMob хак можно переделать для работы с любой мобильной баннерной сетью предлагающей веб-интерграцию. Я рекомендую использовать AdSense for Mobile — нет проблем с fill-rate (баннеры показываются в 100% случаев) и выше CPC. Так или иначе, если вы решили использовать рекламу для монетизиции своего приложения, то вам придется столкнуться с рядом трудностей настройки. Продавать свою игру или дополнительные уровни к ней куда проще.

Заключение


В заключение хочется отметить, что чтобы попробовать движок и даже разработать на нем игру, не нужно платить деньги. С сайта anscamobile.com вы можете скачать его совершенно бесплатно, предварительно зарегистрировавшись. Заплатить придется только если вы решите выложить свою игру на рынок. Отличия демо-версии от полной небольшие: дольше компиляция (подписчики получают приоритет по времени), окошко при запуске скомпилированного приложения уведомляет что это демо-версия, нет доступа к daily builds (т.е. самым новым фишкам и исправлениям). Фактически, полноценное демо позволяет вам сэкономить деньги на подписке пока вы разрабатываете свое приложение.

P.S.
Огромная коллекция текствовых и видео-уроков: www.learningcorona.com
Мне больше всего понравились видео-уроки Рафаэля Фернандеса — очень последовальное и качественное изложение. За них можно брать деньги, но они абсолютно бесплатны.

Несмотря на отличный и быстрый симулятор, реальное устройство вам все равно понадобится для того чтобы оценить производительность. Кроме того, некоторые вещи в симуляторе не поддерживаются. Например, web-popup для отображения веб-страниц внутри приложения или OpenFeint модуль (социальная сеть для геймеров).
Поделиться публикацией

Комментарии 19

    +3
    Скажите, а почему Вы не использовали их «dynamic layouts» (к вопросу о рисовании для разных разрешений)? Не так хорошо работает, как они заявляют?
      +1
      Хороший вопрос. А я про них не знал. Только что почитал вот здесь: blog.anscamobile.com/2011/01/use-dynamic-layouts-in-universal-builds-with-corona-sdk/
      Интересная опция. Поможет боротосься с разным соотношением сторон в разных девайсах. Я эту проблему решил вручную в коде (используя относительные координаты вместо абсолютных) — чуть больше работы, но больше и гибкости. Подробнее об этом можно почитать в статье от разработчика Walkabout: www.base2solutions.com/walkabout/Corona%20Tips.html
      Но графику в двух вариантах — hi- и low-res делать все равно придется.
        0
        Для этого тоже есть MultiRezer
          0
          Я использовал ImageMagick и Batch Processing в Photoshop для автоматизации процесса.
            0
            Вообще, вся графика делалась в Inkscape и сначала я использовал его CLI для batch-экспорта в нескольких разрешениях. Но image sampling в Inkscape не такой качественный, как в ImageMagick или Photoshop при экспорте с маленьким разрешением. Поэтому позже я стал рендерить SVG в большой PNG из которого делал downsampling в нужные разрешения в Photoshop'е.

            Еще стоить отметить, что dynamic image scaling в Corona любит четные размеры картинок. Если у вас есть изображение размером 200x100 для HTC Desire (разрешение экрана 480x800), то для HTC My Touch (320x480) вам нужна картинка в 1.5 раза меньше — приблизительно 133x67. В таком случае, лучше добавить лишние прозрачные пиксели, чтобы размер получился четным — 134x68. В противном случае, dynamic image scaling может внести небольшие артифакты: developer.anscamobile.com/forum/2011/06/12/dynamic-image-scaling-issue
        +4
        Однажды я случайно удалил папку с проектом, а последний бэкап был сделал неделей ранее. Благодаря функции Local History в Idea, хранящую историю всех изменений, мне удалось восстановить проект, когда я уже ни на что не надеялся.

        Git, Mercurial, SVN, не, не слышал.
        Вы же бывший веб-разработчик, как можно не иметь привычки делать бекапы?
          +2
          Спасибо, я в курсе. Едкие замечания делать легко. Ну, допустил ошибку, не оправдываться же теперь.
          0
          Долгое время смотрю с интересом на данный SDK, читаю mobile.tutsplus.com/. Через месяц хочу попробовать на реальном приложении.
            0
            Графику для каждого разрешения приходится делать отдельно, учитывая масштаб и соотношения сторон.
            Мне кажется тут что-то не так в подходе. Иногда действительно приходится дублировать элементы для кардинально различающихся устройств, но для каждой резолюции и отношения сторон? Всегда есть способы этого избежать: разделять графические элементы на слои, что можно масштабировать — масштабировать, что нельзя — выравнивать, что-то можно тайлить или генерить процедурально, есть способы нелинейного масштабирования, вроде андроидовского 9segment, которые отлично подходят для кнопочек, рамочек и т.д. Вообщем вариантов масса.
              0
              Не так выразился. Лучше приведу пример. Допустим, вы хотите разработать приложение для Android-устройств — телефонов и планшетов. Есть бюджетные модели телефонов с разрешением дисплея 320x480, есть более дорогие — 480x800, 480x854 и 540 x 960, и планшеты — 1024x600, 1280x800 и т.д.
              Я бы сделал три варианта графики — по одному для каждой из этих категорий. Причем, чтобы пользователи не жаловались на большой размер приложения, сделал бы два apk — один для телефонов, с первыми двумя вариантами графики, а другой, HD-вариант — для планшетов. И для обоих указал бы поддерживаемые разрешения в AndroidManifest.xml, чтобы пользователю не было нужды выбирать и в рынке автоматически отображалась версия для его/ее устройства.
            • НЛО прилетело и опубликовало эту надпись здесь
              +2
              Я предлагаю посмотреть в сторону getmoai.com/
              Технически она сильно лучше, при этом opensource (исходники на гитхабе). Можно писать свои библиотеки на языках host платформ либо просто использо API на том же LUA.
                0
                То что он технически лучше это большой сюрприз если честно. Он вообще из beta выбрался? Если мне память не изменяет, когда я делал обзор движков он был в beta и API там был скромный. Хотя расширения это +
                  0
                  Ну да он ещё в бете 0.9 и разбираться надо по сути в исходниках. Я просто когда комментарий писал, как то забыл что на первых строках вы писали, что лень разбираться с objective-c, java. Moia хороша для тех кто там и там программировал, порог вхождения пока высокий( с примерами и доками проблемы), но технически она очень хороша.
                0
                У Android тоже есть in-app, если что.
                  0
                  Все верно, но в Corona SDK эта возможность пока не реализована. Сейчас она у них в roadmap на первом месте.
                  0
                  Главный недостаток движка это нет возможности писать нативные расширения для тех кому не хватает функционала. И это может поставить вас в серьезную проблему особенно если вы разрабатываете проект для заказчика.
                    0
                    Спасибо, классная статья!

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

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