Портирование движка INSTEAD на ActionScript

5 октября 2011 г.

Логотип Adobe Flex 4
В качестве вступления описание рабочего окружения, в котором разрабатывался проект:

  • ОС Arch Linux
  • Редактор Vim
  • Flex Framework 4.1
  • Lua-alchemy

Теперь несколько слов о движке INSTEAD.
INSTEAD — движек для написания текстовых квестов (хотя есть и графические игры типа lines, пасьянс). Основная часть кода написана на lua, что позволяет достаточно просто портировать его на различные платформы.
Ниже описаны основные проблемы, с которыми пришлось столкнуться при портировании.

Проблема №1. Lua-alchemy и встраиваемые файлы

На момент написания я не нашел примера использования встроенных файлов в lua-alchemy, тем более на русском языке. Это я и постараюсь сейчас исправить.
Интерпретатор lua-alchemy может использовать файлы, переданные ему с помощью функции supplyFile статического объекта LuaAlchemy.libInit. Для этого создадим класс FS со статическим методом Init:

package
{
    import flash.utils.ByteArray;
    import flash.display.Bitmap;

    public class FS
    {
        [Embed(source='file.lua', mimeType="application/octet-stream")]
        public static const file_lua:Class;

        private static var _filesystemRoot:String;

        public static function filesystemRoot():String
        {
            return _filesystemRoot;
        }

        public static function Init(libInitializer:*):void
        {
            libInitializer.supplyFile("builtin://file.lua",
                          new file_lua() as ByteArray);
            _filesystemRoot = "builtin://";
        }
    }
}

Теперь остается только инициализировать интерпретатор:

FS.Init(LuaAlchemy.libInit);
lua = new LuaAlchemy(FS.filesystemRoot());

и мы можем вызывать file.lua из интерпретатора, например dofile(‘file.lua’).

Проблема №2. Отсутствующие core-функции lua-интерпретатора в lua-alchemy

Изначально lua-alchemy не поддерживает вызов некоторых функций lua-интерпретатора из ActionScript.
Список добавленных функций:

  • public function luaPop(n:uint):void
  • public function luaGetTop():int
  • public function luaGetGlobal(name:String):void
  • public function luaGetField(index:int, name:String):void
  • public function luaRemove(index:int):void
  • public function luaPCall(nargs:int, nresults:int, errfunc:int):int
  • public function luaToBoolean(index:int):Boolean
  • public function luaToString(index:int):String
  • public function luaPushNil():void
  • public function luaPushNumber(value:int):void
  • public function luaPushBoolean(value:int):void
  • public function luaPushString(value:String):void

Также реализована функция загрузки модулей lua require().
Репозиторий lua-alchemy с поддержкой вышеназванных функций на github.

Проблема №3. Прокручивание всей страницы при использовании колесика мыши во Flash-приложении

Эта проблема думаю известна многим, но способ борьбы с ней я нашел не сразу.
Dennis Kolyako реализовал отличный класс для захвата событий колеса мыши в AS3 проектах путем встраивания AS2 movie в AS3 movie. Это лучшее решение на сегодня.

Всего в паблик было выложено две игры (ссылки на Newgrounds):
Возвращение квантового кота
Побег из туалета
Ссылки не для пиара, а дла демонстрации работоспособности проекта.
В игре «Побег из туалета» также используется парсер HTML-like кода, который генерируется движком INSTEAD. Решение использовать собственный парсер связанно с тем, что у TextField ужасная поддержка тэга img.

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики