C/C++调用lua脚本函数

游戏服务端开发也有一段时间了,现在充分体会到脚本的方便与实用。下面简单介绍一下lua有基本用法。

第一步:声明Lua对象指针

lua_State* L;

第二步:初始化lua对象指针与库

L = lua_open();
luaL_openlibs(L);

第三步:加载lua脚本文件

luaL_dofile(L, "xx.lua");

第四步:执行lua中的函数

lua_pcall(L, 2, 1, 0);

2表示传入参数的个数,1为函数返回值个数。

第五步:关闭lua指针

lua_close(L);
L = NULL;

 

下面通过实例说明具体用法:

 

头文件LuaFn.h

  1. extern “C”  
  2. {  
  3.         #include “lua.h”  
  4.         #include “lualib.h”  
  5.         #include “lauxlib.h”  
  6. };  
  7. class CLuaFn  
  8. {  
  9. public:  
  10.         CLuaFn(void);  
  11.         ~CLuaFn(void);  
  12.   
  13.         void Init();            //初始化Lua对象指针参数  
  14.         void Close();         //关闭Lua对象指针  
  15.   
  16.         bool LoadLuaFile(const char* pFileName);                              //加载指定的Lua文件  
  17.         bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);        //执行指定Lua文件中的函数  
  18.   
  19. private:  
  20.         lua_State* m_pState;   //这个是Lua的State对象指针,你可以一个lua文件对应一个。  
  21. };  

 

实现文件LuaFn.cpp

  1. void CLuaFn::Init()  
  2. {  
  3.         if(NULL == m_pState)  
  4.         {  
  5.                 m_pState = lua_open();  
  6.                 luaL_openlibs(m_pState);  
  7.         }  
  8. }  
  9. void CLuaFn::Close()  
  10. {  
  11.         if(NULL != m_pState)  
  12.         {  
  13.                 lua_close(m_pState);  
  14.                 m_pState = NULL;  
  15.         }  
  16. }  
  17. bool CLuaFn:: LoadLuaFile(const char* pFileName)  
  18. {  
  19.         int nRet = 0;  
  20.         if(NULL == m_pState)  
  21.         {  
  22.                 printf(“[CLuaFn:: LoadLuaFile]m_pState is NULL./n”);  
  23.                 return false;  
  24.         }  
  25.         nRet = luaL_dofile(m_pState, pFileName);  
  26.         if (nRet != 0)  
  27.         {  
  28.                 printf(“[CLuaFn:: LoadLuaFile]luaL_loadfile(%s) is file(%d)(%s)./n”, pFileName, nRet, lua_tostring(m_pState, -1));  
  29.                 return false;  
  30.         }  
  31.   
  32.         return true;  
  33. }  
  34. bool CLuaFn::CallFileFn(const char* pFunctionName, int nParam1, int nParam2)  
  35. {  
  36.         int nRet = 0;  
  37.         if(NULL == m_pState)  
  38.         {  
  39.                 printf(“[CLuaFn::CallFileFn]m_pState is NULL./n”);  
  40.                 return false;  
  41.         }  
  42.         lua_getglobal(m_pState, pFunctionName);  
  43.   
  44.         lua_pushnumber(m_pState, nParam1);  
  45.         lua_pushnumber(m_pState, nParam2);  
  46.   
  47.         nRet = lua_pcall(m_pState, 2, 1, 0);  
  48.         if (nRet != 0)  
  49.         {  
  50.                 printf(“[CLuaFn::CallFileFn]call function(%s) error(%d)./n”, pFunctionName, nRet);  
  51.                 return false;  
  52.         }  
  53.   
  54.         if (lua_isnumber(m_pState, -1) == 1)  
  55.         {  
  56.                 int nSum = lua_tonumber(m_pState, -1);  
  57.                 printf(“[CLuaFn::CallFileFn]Sum = %d./n”, nSum);  
  58.         }  
  59.   
  60.         return true;  
  61. }  

main.cpp

  1. #include “LuaFn.h”  
  2. int _tmain(int argc, _TCHAR* argv[])  
  3. {  
  4.         CLuaFn LuaFn;  
  5.   
  6.         //LuaFn.InitClass();  
  7.   
  8.         LuaFn.LoadLuaFile(“Sample.lua”);  
  9.         LuaFn.CallFileFn(“func_Add”, 11, 12);  
  10.         getchar();  
  11.   
  12.         return 0;  
  13. }  


原文链接:http://blog.csdn.net/favormm/article/details/5707753
发布了44 篇原创文章 · 获赞 124 · 访问量 184万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览