Портирование движка INSTEAD на ActionScript
В качестве вступления описание рабочего окружения, в котором разрабатывался проект:
- ОС 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.