让AS3编译时间缩短为0的方法

时间:2021-12-19 00:25:56

每次一改代码AS3的编译时间都很长(10几秒吧)。估计是在做一些条件检验的活。 可以在as3里调用Lua脚本(需用到luaAlchemy.LuaAlchemy库),Lua是纯执行期脚本,所以编译时间缩为0。 同时还有两个好处,1, 如果的后台也是用Lua编写, 则前台和后台的代码一致(招人,维护都更方便)。2, Lua做数据交换的脚本相当灵活(比Json还灵活,因为Json还要去区分是数组还是元素,Lua则两者为同一体).

注: Lua向as3传中文时可能有乱码的问题, 把Lua文件的编码方式改下即可解决。方法: 用SciTE新建一个空白文件,在页头保存一行代码: code.page=65001. 再点保存即可。

 

一个想法是:前台用as3, 应用逻辑用lua, 后台框架用C++ 

import luaAlchemy.LuaAlchemy;
import luaAlchemy.LuaAssets;

import ui.controls.Alert;

public class LuaEngine
{
//LUA
public static const SC_CMD_LUA_MSG : int= 1;

public var G_lua:LuaAlchemy = null;
public var G_AS3_Buf:Array = null;

public function LuaEngine()
{
G_lua = new LuaAlchemy();
G_AS3_Buf = new Array();
G_lua.init();
G_lua.setGlobal("AS3", this);
}

/**
* 单例对象
* */
private static var _instance : LuaEngine;

/**
* 获取单例对象
* */
public static function getInstance() : LuaEngine
{
if( null == _instance )
{
_instance = new LuaEngine();
}
return _instance;
}

/**
* 执行Lua函数
* */
public function RunLuaFun( funName : String, ... params) : void
{
var str:String = funName + "()";
var separator:String = "";
if(params != null && params.length > 0)
{
var key:int = 0;
for each(var param : * in params)
{
API_SetAS3Par(++key, param);
}
}
LuaEngine.getInstance().G_lua.doString(str);
}

/*------------------------- CallBack -------------------------*/
/**
* 函数消息处理
* */
public function onGameMessage(protocalId:int, buffer:ByteBuffer):void
{
if( protocalId == SC_CMD_LUA_MSG )
{
RunLuaFun("Client_onGameMessage", buffer.readString());
}
}

/**
* 当客户端点击NPC时
* */
public function onClickNPC( npc:int ) : void
{
RunLuaFun("Client_onClickNPC", npc);
}

/**
* 当点击NPC面板选项消息
* */
public function onClickDlgItem( item:DialogCommandData ) : void
{
RunLuaFun("Client_onClickDlgItem", item);
}

/*------------------------- API -------------------------*/
/**
* AS3类型转成LUA类型
* */
public function API_AS3_TO_Lua( obj:Object ):void
{
if( null == obj)
{
G_lua.doString("API_AS3_TO_Lua_Type_BUF = nil");
}
else if(obj is int)
{
G_lua.doString("API_AS3_TO_Lua_Type_BUF = " + obj);
}
else if(obj is Boolean)
{
if( Boolean )
G_lua.doString("API_AS3_TO_Lua_Type_BUF = true");
else
G_lua.doString("API_AS3_TO_Lua_Type_BUF = false");
}
else if(obj is String)
{
var par:String = obj.split("\"").join("\\\"");
G_lua.doString("API_AS3_TO_Lua_Type_BUF = \"" + par + "\"");
}
else if(obj is Number)
{
G_lua.doString("API_AS3_TO_Lua_Type_BUF = " + obj);
}
else
{
G_lua.setGlobal("API_AS3_TO_Lua_Type_BUF", obj);
}
}

/**
* 填充临时数据
* */
public function API_SetAS3Par( key:int, data:Object ):void
{
G_AS3_Buf[key] = data;
}

/**
* 获得临时数据
* */
public function API_GetAS3Par( key:int ):Object
{
var obj:Object = G_AS3_Buf[key]
return obj;
}

/**
* 向服务器发信息
* */
public function API_SendCmd( _buf:String ) : void
{
var code_buf:Array = new Array();
code_buf[0] = new Byte( GameMessage.CMD_ROOT_THING );
code_buf[1] = new Byte( GameMessage.ROOTTHING_CS_MAIN_INTERACT );
code_buf[2] = "OnInteractions";
code_buf[3] = _buf;
NetManager.getInstance().sendMsg( code_buf );
}

/**
* trace信息
* */
public function API_Trace( str:String ):void{trace(str); }

/**
* 载入文件
* */
public function API_LoadFile( str:String ):void
{
var str:String = LoadLuaFile.getInstance().getFileBuf(str);
if( null != str )
{
G_lua.doString(str);
}
}

/**
* 获得对话面板
* */
public function API_GetNPDDlg():DialogView
{
//对话面板
UiManager.addWidget(UiManager.WIDGET_DIALOG);
var dialogView : DialogView = UiManager.getWidget(UiManager.WIDGET_DIALOG) as DialogView;
if(dialogView && !dialogView.isHide)
{
return dialogView;
}
return null;
}

private function API_TalkMsg( str:String ) : void
{
Alert.show(str, "" ,null ,Alert.YES | Alert.NO ,null ,null);
}
}


 

-- ------------------------------------
-- 载入文件
-- ------------------------------------
function Lua_AS3ToLua( _obj )
AS3.API_AS3_TO_Lua(_obj)
return API_AS3_TO_Lua_Type_BUF
end

function Lua_GetAS3Par( _key )
local obj = AS3.API_GetAS3Par(_key)
return Lua_AS3ToLua(obj)
end




-- ------------------------------------
-- 载入文件
-- ------------------------------------
function Lua_LoadFile( _file_name )
local ret = AS3.API_LoadFile(_file_name)
--AS3.API_Trace("载入" .. _file_name .. ", 结果" .. ret)
end

-- ------------------------------------
-- 载入LUA文件
-- ------------------------------------
Lua_LoadFile("LUA_Util.lua")
Lua_LoadFile("LUA_Message.lua")
Lua_LoadFile("LUA_CallBack.lua")