设为首页 加入收藏

TOP

如何用C++做游戏(二)
2018-06-14 09:13:37 】 浏览:791
Tags:何用 游戏
== 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); int nIn = lua_gettop(m_pState); <–在这里加一行。 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); } int nOut = lua_gettop(m_pState); <–在这里加一行。 lua_settop(m_pState, -2); <–清除不用的栈。 return true; }

好了,再让我们运行100万次,看看你的程序内存,看看你的程序还崩溃不? 如果你想打印 nOut的话,输出会变成1,1,1,1,1。。。。

最后说一句,lua_tonumber()或lua_tostring()还有以后我们要用到的lua_touserdata()一定要将数据完全取出后保存到你的别的变量中去,否则会因为清栈操作,导致你的程序异常,切记!

呵呵,说了这么多,主要是让大家如何写一个严谨的Lua程序,不要运行没两下就崩溃了。好了,基础栈的知识先说到这里,以后还有一些技巧的运用,到时候会给大家展示。

下面说一下,Lua的工具。(为什么要说这个呢?呵呵,因为我们下一步要用到其中的一个帮助我们的开发。)

呵呵,其实,Lua里面有很多简化开发的工具,你可以去https://www.sourceforge.net/去找一下。它们能够帮助你简化C++对象与Lua对象互转之间的代码。

这里说几个有名的,当然可能不全。

(lua tinker)如果你的系统在windows下,而且不考虑移植,那么我强烈推荐你去下载一个叫做lua tinker的小工具,整个工具非常简单,一个.h和一个.cpp。直接就可以引用到你的工程中,连独立编译都不用,这是一个韩国人写的Lua与 C++接口转换的类,十分方便,代码简洁(居家旅行,必备良药)。

它是基于模板的,所以你可以很轻松的把你的C对象绑定到Lua中。代码较长,呵呵, 有兴趣的朋友可以给我留言索要lua tinker的例子。就不贴在这里了。不过我个人不推荐这个东西,因为它在Linux下是编译不过去的。它使用了一种g不支持的模板写法,虽然有人在 尝试把它修改到Linux下编译,但据我所知,修改后效果较好的似乎还没有。不过如果你只是在 windows下,那就没什么可犹豫的,强烈推荐,你会喜欢它的。

(Luabinder)相信用过Boost库的朋友,或许对这个家伙很熟悉。它是一个很强大的Linux下Lua扩展包,帮你封装了很多Lua的复 杂操作,主要解决了绑定C++对象和Lua对象互动的关系,非常强大,不过嘛,对于freeeyes而言,还是不推荐,因为freeeyes很懒,不想为 了一个Lua还要去编译一个庞大的boost库,当然,见仁见智,如果你的程序本身就已经加载了boost,那么就应该毫不犹豫的选择它。

(lua++)呵呵,这是我最喜欢,也是我一直用到现在的库,比较前两个而言,lua++的封装性没有那么好,很多东西还是需要一点代码的,不过之 所以我喜欢,是因为它是用C写的,可以在windows下和linux下轻松转换

还记得我昨天说过如何编译Lua么,现在请你再做一遍,不同的是,请把lua的程序包中的src/lib中的所有h和cpp,还有 include下的那个.h拷贝到你上次建立的lua工程中。然后全部添加到你的静态链接库工程中去,重新编译。会生成一个新的lua.lib,这个 lua就自动包含了lua的功能。最后记得把tolua++.h放在你的Include文件夹下。 行了,我们把上次CLuaFn类稍微改一下。

extern “C” 
{ 
        #include “lua.h” 
        #include “lualib.h” 
        #include “lauxlib.h” 
        #include “tolua++”   //这里加一行 
};

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文件对应一个。 
};

行了,这样我们就能用Lua++下的功能了。

大家看到了 bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);这个函数的运用。演示了真么调用Lua函数。

下面,我改一下,这个函数。为什么?还是因为freeeyes很懒,我可不想每有一个函数,我都要写一个C++函数去调用,太累!我要写一个通用的!支持任意函数调用的接口!

于是我创建了两个类。支持任意参数的输入和输出,并打包送给lua去执行,说干就干。

#ifndef _PARAMDATA_H 
#define _PARAMDATA_H

#include 
  
   

#define MAX_PARAM_200 200

using namespace std;

struct _ParamData 
{ 
public: 
        void* m_pParam; 
        char  m_szType[MAX_PARAM_200]; 
        int   m_TypeLen;

public: 
        _ParamData() 
        { 
                m_pParam    = NULL; 
                m_szType[0] = ‘/0′; 
                m_TypeLen   = 0; 
        };

        _ParamData(void* pParam, const char* szType, int nTypeLen) 
        { 
                SetParam(pParam, szType, nTypeLen); 
        }

        ~_ParamData() {};

        void SetParam(void* pParam, const char* szType, int nTypeLen) 
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++设计模式之应用(型别对型别的.. 下一篇用c++实现的八大排序算法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目