0
回答
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

extern “C”
{
        #include “lua.h”
        #include “lualib.h”
        #include “lauxlib.h”
};
class CLuaFn
{
public:
        CLuaFn(void);
        ~CLuaFn(void);

        void Init();            //初始化Lua对象指针参数
        void Close();         //关闭Lua对象指针

        bool LoadLuaFile(const char* pFileName);                              //加载指定的Lua文件
        bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);        //执行指定Lua文件中的函数

private:
        lua_State* m_pState;   //这个是Lua的State对象指针,你可以一个lua文件对应一个。
};

 

实现文件LuaFn.cpp

void CLuaFn::Init()
{
        if(NULL == m_pState)
        {
                m_pState = lua_open();
                luaL_openlibs(m_pState);
        }
}
void CLuaFn::Close()
{
        if(NULL != m_pState)
        {
                lua_close(m_pState);
                m_pState = NULL;
        }
}
bool CLuaFn:: LoadLuaFile(const char* pFileName)
{
        int nRet = 0;
        if(NULL == m_pState)
        {
                printf(“[CLuaFn:: LoadLuaFile]m_pState is NULL./n”);
                return false;
        }
        nRet = luaL_dofile(m_pState, pFileName);
        if (nRet != 0)
        {
                printf(“[CLuaFn:: LoadLuaFile]luaL_loadfile(%s) is file(%d)(%s)./n”, pFileName, nRet, lua_tostring(m_pState, -1));
                return false;
        }

        return true;
}
bool CLuaFn::CallFileFn(const char* pFunctionName, int nParam1, int nParam2)
{
        int nRet = 0;
        if(NULL == m_pState)
        {
                printf(“[CLuaFn::CallFileFn]m_pState is NULL./n”);
                return false;
        }
        lua_getglobal(m_pState, pFunctionName);

        lua_pushnumber(m_pState, nParam1);
        lua_pushnumber(m_pState, nParam2);

        nRet = lua_pcall(m_pState, 2, 1, 0);
        if (nRet != 0)
        {
                printf(“[CLuaFn::CallFileFn]call function(%s) error(%d)./n”, pFunctionName, nRet);
                return false;
        }

        if (lua_isnumber(m_pState, -1) == 1)
        {
                int nSum = lua_tonumber(m_pState, -1);
                printf(“[CLuaFn::CallFileFn]Sum = %d./n”, nSum);
        }

        return true;
}

main.cpp

#include “LuaFn.h”
int _tmain(int argc, _TCHAR* argv[])
{
        CLuaFn LuaFn;

        //LuaFn.InitClass();

        LuaFn.LoadLuaFile(“Sample.lua”);
        LuaFn.CallFileFn(“func_Add”, 11, 12);
        getchar();

        return 0;
}


原文链接:http://blog.csdn.net/favormm/article/details/5707753
<无标签>
举报
长平狐
发帖于6年前 0回/4K+阅
顶部