Создание нативной библиотеки расширений для OpenFL (Haxe)

Предисловие


Если вы задумались о создании мобильных приложений, но не знаете с чего начать, у вас есть достаточно времени на эксперименты и изучение нового, то позвольте порекомендовать вам в качестве инструмента выбрать язык программирования haxe. Возможно, вы о нем уже слышали и возможно, слышали о нем, как о некоторой замене для Flash'a. Это не совсем так, и можно даже сказать совсем не так.

Да, стандартная библиотека haxe имеет подмножество классов и функций, организационно похожих на стандартную библиотеку actionscript 3. Но это не мешает создавать приложения для нативных платформ, таких как Linux, Windows, Android, Mac, iOS.

При создании приложений для нативных платформ возможностей стандартной библиотеки не хватает и приходится искать сторонние библиотеки или разрабатывать свои. Я пошел по второму пути и для текущего проекта (небольшой игры, похожей на TripleTown по механике) разработал библиотеку для работы с Flurry, Localytics, GooglePlay Game Services и некоторыми другими сервисами.

В представленом ниже переводе, описывается с чего начать, если вы хотите создать библиотеку расширений для haxe и фреймворка OpenFL (бывший NME), в частности. Автор оригинальной статьи Laurent Bédubourg.


Создание простого расширения для OpenFL


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

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

Использовать высокоуровневые библиотеки клево, но иногда необходимы нативные функции, которые описаны в документации, но не доступны из библиотек. Чтобы решить эту проблему существует адобовский ANE и он, надо сказать, делает это хорошо.

Но как же нам получить такие же возможности в OpenFL? Ниже я опишу мои попытки справиться с этой задачей.

Следующим образом, используя шаблон из OpenFL, можно создать расширение:
$ openfl create extension TestExtension
$ cd TestExtension
$ ls -1
TestExtension.hx   # обертка на языке haxe для вашего расширения
haxelib.json       # описание проекта для haxelib
include.xml        # описание расширения, openfl будет использовать его для
                   # включения в приложение
ndll/              # в этом каталоге будут нативные библиотеки для каждой
                   # платформы
project/           # исходный код расширения

После компиляции расширения под все поддерживаемые платформы в каталоге ndll/ появятся соответствующие нативные библиотеки.
cd project/
haxelib run hxcpp Build.xml
haxelib run hxcpp Build.xml -Dandroid
haxelib run hxcpp Build.xml -Diphoneos -DHXCPP_ARMV7
haxelib run hxcpp Build.xml -Diphonesim

Теперь нам необходимо зарегистрировать наше расширение в haxelib:
cd ..
haxelib dev TestExtension `pwd`

Чтобы убедиться, что создание расширения прошло успешно, сделаем следующее:
mkdir TestApp
cd TestApp

Создадим project.xml:
<?xml version="1.0" encoding="utf-8"?>
<project>
	<meta
        title="TestApp"
        package="me.labe.testapp"
        version="1.0.0"
        company="Laurent Bedubourg"
        />
	<app
        main="Main"
        path="Export"
        file="TestApp"
        />
	<source path="." />
	<haxelib name="openfl" />
  <haxelib name="TestExtension" />
</project>


Main.hx:
class Main {
    public static function main(){
        var t = new flash.text.TextField();
        t.text = Std.string(TestExtension.sampleMethod(16));
        flash.Lib.current.addChild(t);
    }
}

Скомпилируем и протестируем следующим образом:
openfl test project.xml cpp
openfl test project.xml android
openfl test project.xml ios -simulator
openfl test project.xml ios

Все прекрасно работает на Маке и на Андроиде.

Мне все еще нужно разобраться как использовать внешние библиотеки, как структурировать исходный код для различных платформ, но уже это хорошее начало: создать расширение для OpenFL проще, чем расширение для Adobe Air (ANE).

К сожалению, у меня пока остались ошибки линковки для iOS и когда я разберусь с ними, я обновлю эту статью.

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

Дополнение: Похоже, что мои проблемы с линковкой под iOS связаны с несоответствием регистров имен импортируемых функций. Как только, эта ошибка будет исправлена, вы сможете без проблем экспериментировать с расширениям с именами в нижнем регистре (как и предполагается под iOS).

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

Дополнение: Джошуа Граник исправил шаблон расширения, так что теперь все будет отлично работать прямо из коробки*.

* от переводчика — я оставил все дополнения в переводе с той целью, что они могут пригодиться кому-нибудь при возникновении подобных ошибок.
  • +12
  • 5,2k
  • 7
Поделиться публикацией
Комментарии 7
    +3
    Спасибо, побольше бы статей по openfl, особенно по геймдеву.
      0
      Спасибо, будем стараться.
      +3
      Спасибо за статью:)

      Haxe в массы!
        0
        Спасибо!
        +1
        А как у haxe обстоит дело с GUI? Возможно ли написать на haxe полноценное приложение с нативным UI не рисуя и программируя все кнопочки вручную?
          +2
          C GUI по разному, есть несколько библиотек, в которых реализован разный набор контролов/виджетов. Эти библиотеки можно использовать и для нативных платформ. Список библиотек можно посмотреть вот здесь — haxe.ru/gui-libs.

          waxe (обертка поверх wxWidgets) точно должна работать под Windows: cambiatablog.wordpress.com/category/waxe/.
            +2
            Для Android/iOS есть вот такой проект, хотя больше ничего не могу сказать о нем — не смотрел: github.com/Randonee/Basis
            Вообще самая развитая гуина сейчас вроде как StablexUI, но она использует OpenFL (кросс-платформенную реализацию flash api), а не нативные виджеты.

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

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