简介
LUA脚本是一种可以嵌入C/C++模块的解释型语言,解释性语言与C/C++之类的编译型语言比较优点在于它无需重新编译即可生效,在处理得当的情况下甚至不需要停下程序。LUA只内置了一个功能简单的库,其他功能都需要宿主程序提供接口。
使用例子
C/C++模块(宿主程序)
工作线程
bool initLuaScript();
bool runLuaScript();
DWORD WINAPI MyMainWorkThread(LPVOID lpParam){
initLuaScript();
while (1){
if (!g_bThreadEnable){
ResetEvent(g_hEventRun);
m_GameCall.GoToTradePos();
}
WaitForSingleObject(g_hEventRun,INFINITE);
Sleep(2000);
//在这里添加主逻辑代码。
gs_DebugModel = false;
gs_petNameVec.clear();
gs_ptInEye.x = 0;
gs_ptInEye.y = 0;
gs_ptOutEye.x = 0;
gs_ptOutEye.y = 0;
if(0 == runLuaScript()){
MessageBoxW(NULL,L"载入命令失败了。",NULL,MB_OK);
Sleep(1000);
continue;
}
}
}
初始化脚本和运行脚本
这段代码注册给LUA开放的接口,当LUA脚本执行时调用对应的函数。注册完后,如果LUA脚本执行“寻路到”函数将调用Lua_FindPathMoveTo这个C++接口,并将参数传递给 它。运行脚本只是简单调用了luaC库的luaL_dofile,这个函数将读入文件内容并且执行其中的脚本。当然如果你不想把这些内容暴露出来可以加密这些LUA脚本文件然后把文件载入后解密再使用lua库的lua_dostring/lua_pcall接口,这里就不再详述。
bool initLuaScript(){
L=lua_open();//初始化指针
lua_register(L,"设置捡血",Lua_SetIsPickXueBao);
lua_register(L,"走路到",Lua_MoveTo);
lua_register(L,"延时",Lua_sleep);
lua_register(L,"进入地图",Lua_EnterMap);
lua_register(L,"复活",Lua_DeadRelive);
lua_register(L,"离开地图",Lua_LeaveMap);
lua_register(L,"合体宝宝",Lua_CallPetsBattle);
lua_register(L,"解体宝宝",Lua_RecallPets);
lua_register(L,"拾取物品",Lua_PickUpfuben);
lua_register(L,"飞回城里",Lua_FlyToCity);
lua_register(L,"飞到门口",Lua_FlayToDoorNear);
lua_register(L,"修理装备",Lua_RepairXianglianAndWeapon);
lua_register(L,"寻路到",Lua_FindPathMoveTo);
lua_register(L,"等待死亡",Lua_WaitForDead);
lua_register(L,"技能1",Lua_MagicAttackSkill1);
lua_register(L,"技能_BOSS",Lua_FengZhuKillBoss);
lua_register(L,"技能2_按类型_距离",Lua_MagicAttackBaoLeiWithMonsterTypeFarThanDis);
lua_register(L,"技能2_按类型_小于等于距离",Lua_MagicAttackBaoLeiWithMonsterTypeNotFarThanDis);
l