Краткое введение в MOAI Framework

    Когда речь идет о бизнес приложениях, принято писать несколько копий под каждую из популярных мобильных платформ. Это вполне оправдано, т. к. Android/iOS/etc платформы столь специфичны, что реализовать по принципу «Code at once — run everywhere» довольно сложно. Однако, ситуация совсем иная, когда речь идет о мобильных играх. У игр как правило свой собственный стиль графических элементов — кнопок, меню и т. д., и вся графика построена либо на спрайтах, либо на 3D (прим. — в дальнейшем речь будет идти только о 2D движках). Появляется вполне закономерное желание написать приложение один раз и собирать его под разные платформы.
    Достичь этого нам поможет кросплатформенный фреймворк MOAI.



    Прежде всего, почему именно MOAI? Этот фреймворк был выбран целенаправленно. Для себя я решил, что мне нужен движок, который:
    • Кросплатформенный
    • Использует аппаратное ускорение OpenGL
    • Игровая логика реализуется скриптовым языком (желательно LUA)
    • Должна быть возможность писать расширения на C/C++
    • Желательно опенсорсовый. Последнее было обусловлено не желанием сэкономить денег, а возможностью править сам движок в случае каких-то критичных багов


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

    Из кандидатов на фреймворки я рассматривал Corona SDK, Gideros, Cocos2d-X (да, есть возможность скриптовать его на Lua) и MOAI.
    Если сравнивать Corona SDK и Gideros, то на мой взгляд более предпочтителен Gideros. Т.к. в поставку входят различные инструменты, включая простенькую IDE, есть возможность писать плагины, а бесплатный режим отличается от платного только наличием сплеш скрина gideros. Корона же в бесплатном режиме ставит таймаут на сборку (но не на эмуляторе), к тому же после запуска появляется диалог, что нужно купить Корону, тогда диалога не будет. Плагины писать можно только после покупки Corona Enterprise, цена которой вообще не указана. UPD: как мне написал пользователь Lerg, с недавних пор их продукт немного изменился: habrahabr.ru/post/175689 Но тем не менее, по некоторым параметрам Корона лучше — у нее большее сообщество, а также более оптимизирован сам движок (загрузка спрайтов и т.п.).

    Выбирая между Cocos2d-X и MOAI, я выбрал последний, т.к. он изначально разрабатывался, как движок на Lua.

    Установка


    Клонируем его здесь github.com/moai/moai-dev или, что еще лучше, делаем форк.
    Бинарную сборку ставить не рекомендую, т. к. если вы не заинтересованы в модифицировании движка, то скорее всего, лучше попробуйте Gideros.
    Далее открываете проект в Xcode проект moai-sdk/xcode/osx/MoaiSample.xcodeproj и компилируете moai бинарник.
    Внимание, десктопные версии MOAI есть и под Windows и Linux! Но собрать iOS проект можно, конечно только под маком.

    После того, как moai установлен, пробуем запустить пример:
    Заходим в директорию /usr/local/moai-sdk/samples/hello-moai и запускаем пример
    moai main.lua
    В этот момент программист, разрабатывавший под Android или iOS, должен получить огромнейшее удовольствие от того, как запускается пример. Он запускается мгновенно! Без компиляции, перепаковки и прочего. Запустил пример и сразу увидел результат. Честно сказать, оно того стоит!

    Android


    Чтобы запустить приложение под Android или iOS, нужно создать соответствующие сборки. Для Android все делается довольно просто — при помощи скрипта moai-sdk/ant/make-host.sh создаем базовый Android проект, скрипту можно указывать дополнительные опции.
    Базовый проект — это исходники Android приложения, которое содержит в себе Moai библиотеки, а также скрипт для упаковки в итоговый *.apk lua файлов, графики и других файлов, необходимых вашей программе.

    Копируем полученый unkown-host в необходимое место (у меня — это директория ~/Projects), указываем в settings-local.sh путь к Android SDK:
    android_sdk_root="/usr/local/android-sdk"
    и путь, где лежит основной проект на Lua
    src_dirs=( "/Users/alex/Projects/myproject" )

    Теперь, чтобы запустить приложение на Android, запускаем скрипт run-host.sh
    Нужно иметь ввиду, что сборщик довольно простой — он просто забирает исходники Android приложения, копирует в них MOAI проект и собирает apk. Т.е. если нужно включить в приложении поддержку акселерометра, то нужно явно отредактировать MainActivity.java в исходниках базового проекта.

    iOS


    Под iOS примерно такой же механизм, только нет такого удобного скрипта для создания нового хоста. Предлагается скопировать семпловый проект и изменять его.
    В принципе, это не сложно, но лично мне довольно не комфортно, когда нужно ковырять графические настройки проекта в Xcode.
    Внимание — свежие исходники MOAI из репозитория (что не удивительно) могут содержать баги, поэтому если собрать проект не получается, то пробуйте Поэтому, если не хотите тоже с этим разбираться, то либо делайте чекаут стабильных ревизий (по тегам), либо клонируйте мой форк (https://github.com/Nepherhotep/moai-dev), который редко обновляется, и поэтому более стабильный.

    Далее разработка выглядит следующим образом — пишете и тестируете код на рабочей машине, а сборку под Android/iOS делаете перед релизом версии.

    Полезное


    getmoai.com — официальный сайт MOAI
    github.com/moai/moai-dev — исходники на гитхабе
    github.com/ymobe/rapanui/tree/master/rapanui-sdk — фреймворк высокого уровня, использующий MOAI
    github.com/derickd/moaigui — библиотека виджетов для MOAI
    github.com/Nepherhotep/terevaka — еще один фреймворк высокого уровня для MOAI, собственного приготовления и с плюшками. Подробнее в моей следующей статье habrahabr.ru/post/176771
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      0
      Нужно не краткое введение, а полномасштабное…
        0
        В принципе, по своему API MOAI точно такой же, как Cocos2D или вообще любой другой 2D движок. Имеет смысл разве что сделать туториал на русском, но на английском они уже есть. Хотя возможно что-нибудь подобное сделаю :)
          0
          У каждого есть свои особенности и подводные камни. Это всё хотелось бы узнать.
            0
            Ну… к примеру, у MOAI явно выражена модульная архитектура, большинство полезных плюшек — интеграция с фейсбуком, tapjoy и прочее реализуется при помощи плагинов. К примеру, даже звук можно подключить используя две разные библиотеки — fmod или untz. Что касается движка физики- используется Chipmunk.
            Из непривычного в MOAI — необычное именование объектов. К примеру, спрайт называется prop. В туториале поясняется, почему так — в реальных приложениях в sprite запихивают кучу дополнительных свойств, превращая его в игровой объект. К тому же, под спрайтом часто понимают саму текстуру, что также вносит путаницу. В целом, именование классов в MOAI выбрано, чтобы по смыслу максимально кореллировало с терминами OpenGL.
            Одним словом, MOAI довольно низкоуровневый фреймворк, поэтому API его сделано так, чтобы это взаимдействие не вуалировалось.
              0
              Прошу прощения — используется Box2D движок физики. Хотел написать, что Chipmunk не используется, но вместо этого машинально написал все наобарот :)
              0
              Пример его «низкоуровневости» хотя бы в том, как реализована сборка под различные платформы. В MOAI под любую платформу должен быть запущен объект MOAISim, который представляет собой что-то наподобие виртуальной машины, хотя в реальности MOAISim сделан по принципу паттерна Адаптер.
              Этот MOAISim запускает в себе Lua код из main.lua файла (на самом деле, если посмотреть исходники, за непосредственно запуск отвечает код в библиотеке AKU, и именно там идет разделение по плафтормам, но это не суть важно).
              Сборка под конкретную платформу сводится к тому, чтобы во-первых собрать сам MOAI (и MOAISim), упаковать Lua код в приложение, а также связать железо с соотвествующими вызовами в MOAI. Последним занимается код, написаный в нативном для конкретной платформы виде. К примеру для андроида можно увидеть, что Android Host представляет собой стартовый Activity, в котором запускается Moai через JNI.
              Для iOS — это AppDelegate, в котором происходит примерно то же самое. Естесственно, хосты-заготовки уже есть, но часто их нужно адаптировать под свои нужды. К примеру, затачивать под Landscape/Portrait и т.п.
                0
                Теме не менее, по своим возможностям, он практически идентичен Cocos2D. Те же спрайты (только названые по-другому), те же Action (с ease функциями), та же возможность загружать текстуры в виде разделных картинок, так и кучу спрайтов в одной текстуре. При этом логика пишется на Lua, что очень сильно ускоряет разработку.
                На практике, скорость разработки заметна ускоряется еще и из-за возможности запускать примеры прямо на компьютере — сборки MOAI есть практически под любую платформу. По крайней мере, Windows, Linux, Mac OS X, Android, iOS, windows phone и blackberry — на счет работоспособности двух последних не в курсе, но сборки есть.
                Ну и есть возможность использовать дополнительные библиотеки вроде RapanUI — они действительно уменьшают количество кода при разработке.
                  0
                  Спасибо.
            0
            Вопрос к автору и/или тем, кто имел дело с этим фреймворком.
            Если я правильно понял, то он работает как LUA интерпретатор, т.к. JIT запрещён, а в статику (как Marmalade или Xamarin) он не компилит. Как у него со скоростью?
              0
              MOAI целиком написан на C++, Lua используется только для написания логики самого приложения. К примеру, вызов функции загрузки спрайта из Lua — это просто биндинг, то же самое касается анимаций и пр. Поэтому, проблем с производительностью не будет.
              Но если нужно написать какую-то тяжелую функцию, например, если вам нужен bson парсер, то реализовывать ее придется на C++ и делать биндинг. В принципе, это стандартный подход при разработке приложений на скриптовых языках — если не хватает производительности, то конкретный участок переписывается на C/C++.
              На практике, у меня в приложении есть реализации бинарного протокола, который я полностью реализовал на Lua, каких-то проблем с производительностью я не заметил.
              0
              Это фреймворк только для игр или обычные приложения тоже можно писать?
                0
                Это прежде всего игровой движок. Т.е. обычные приложения тоже можно писать, но это имеет смысл, только если будет специфическая графика, не похожая на родную для каждой из платформ. К тому же, приложение всегда будет использовать OpenGL, так что для обычных приложений — это не самый лучший вариант.

              Only users with full accounts can post comments. Log in, please.