解决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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值