您的位置:首页 > 编程语言 > Lua

解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数

2012-11-08 14:00 911 查看

解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数

bool LuaScriptMgr::Call_GlobalFunc( const char* pFuncName , const char* pFormat,...)

{

if(!pFuncName || 0 == *pFuncName || !pFormat)

return false;

LuaPopAll pup (m_pLuaState);

lua_getglobal(m_pLuaState, pFuncName);

va_list t_oParamList;

int t_sArgNum = 0;

int t_sRes = 0;

va_start(t_oParamList,pFormat);

for (t_sArgNum=0; 0!= *pFormat; ++t_sArgNum){

switch(*pFormat++)

{

case 'd':

case 'D':

{

double d = va_arg(t_oParamList, double);

lua_pushnumber(m_pLuaState, d);

}

break;

case 'f':

case 'F':

{

double f = va_arg(t_oParamList, double);

lua_pushnumber(m_pLuaState, f);

};

break;

case 'u':

case 'U':

{

unsigned int u = va_arg(t_oParamList, unsigned int);

lua_pushnumber(m_pLuaState, u);

}

break;

case 'i': // int参数

case 'I':

{

int i = va_arg(t_oParamList, int);

lua_pushinteger(m_pLuaState, i);

}

break;

case 's': // 字符串参数

case 'S':

{

char* c = (char*)va_arg(t_oParamList, unsigned int);

lua_pushstring(m_pLuaState, c);

}

break;

case '-': // 参数结束

{

goto Jump_ArgEnd;

}

break;

default:

{

assert(0&&"Script Call Param Error !\n");//Note: BM_Add 12.10.17-15.49

}

break;

};

};

Jump_ArgEnd:

t_sRes = strlen(pFormat);

if(0 != lua_pcall(m_pLuaState, t_sArgNum, t_sRes, 0) )

{

va_end(t_oParamList);

MHFS_LOGERROR("脚本", "脚本文件:%s执行错误,返回码:%d!", pFuncName , t_sRes);

return false;

}

//Note:

#ifdef _DEBUG

int t_sReturnNum = lua_gettop(m_pLuaState);

if(t_sRes != t_sReturnNum){

assert("Require Return Num != Actually Return Num.");

}

#endif//

int nIndex = -t_sRes;

while( 0 > nIndex ){

switch(*pFormat++)

{

case 'd': // double结果

case 'D':

{

*va_arg(t_oParamList, double*) = lua_tonumber(m_pLuaState, nIndex);

};

break;

case 'f': // float结果

case 'F':

{

*va_arg(t_oParamList, float*) = lua_tonumber(m_pLuaState, nIndex);

};

break;

case 'u': // dword结果

case 'U':

{

*va_arg(t_oParamList, unsigned int*) = lua_tonumber(m_pLuaState, nIndex);

};

break;

case 'i': // int结果

case 'I':

{

*va_arg(t_oParamList, int*) = lua_tointeger(m_pLuaState, nIndex);

}

break;

case 'b': // BOOL结果

case 'B':

{

*va_arg(t_oParamList, bool*) = lua_toboolean(m_pLuaState, nIndex);

};

break;

default:

{

assert(0&&"Script Call Param Error !\n");//Note: BM_Add 12.10.17-15.49

}

break;

};

++nIndex;

}

lua_pop(m_pLuaState, t_sRes);

va_end(t_oParamList);

return true;

};

/*Note:

函数目的:

{

解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数

}

使用方法

{

假如 你想调用 Lua 函数

function PVP_Can_BeginPVP(uLevel)

if uLevel < 2 then

return false

end

return true

end

次函数需要1个参数传入! 1个参数返回

那就这样

unsigned int RoleEevel = Role->GetLvel()

bool bCanEnter;

Call_GlobalFunc("PVP_Can_BeginPVP","u-b",RoleEevel,&bCanEnter)

其中 bCanEnter 是 记录lua 函数的返回值

"u-b" 规则! ‘-’前是声明传入参数的类型 '-'后是返回的类型

d/D f/F = double

u/U = unsgined int

i/I = int

s/S = char*

}

函数弱点:

{

不能返回 string

}

*/

bool Call_GlobalFunc(const char* pFuncName , const char* pFormat,...);//Note: BM_Add
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: