focus on linux, c/c++, lua

自己动手封装LuaEngine

1, Q:为什么没有用Luaplus或是其他的Binder?
    A: nice question! Luaplus不能满足我在linux下使用,其他的太庞大,我需要一个轻量级的。

2,Q:是原创吗?
   A:NO, thanks to Matthew Harmon matt@matthewharmon.com,我按照自己的需求做了封装。

3,Q:它的优点是什么?
   A:主要是它简单,基本能满足和C/C++交互的需求。它使用了lua_newthread来管理每一个脚本(性能有问题吗?)。它支持
       事件的resume,另外把LuaDebugger也封装进来了,方便调试。

 贴下接口头文件:
#ifndef    ILUAENGINE_H
#define    ILUAENGINE_H

#define GTC_LP        0x0000    // 指针
#define GTC_INT        0x0001    // 整型
#define GTC_DOUBLE    0x0002    // 浮点型
#define GTC_STRING    0x0003    // 字符串

// 脚本数据类型定义
enum
{
    SD_NUMBER 
= 0,    // 数字类型
    SD_STRING,        // 字符串类型
    SD_TABLE,        //
}
;

struct SSDTable
{
    
int nNum;
    
void* pValue;
}
;

// 脚本参数对象
struct SScriptParamObj
{
    
int nType;            // 参数类型, SD_NUMBER 或者 SD_STRING

    union UScriptParam    
// 参数值
    {
        
int        nNumber;        // 数字
        char    szString[64];    // 字符串
        SSDTable stTable;

    }
 unValue;

    SScriptParamObj()
    
{
        memset(
this0sizeof(*this));
    }


    
void operator = (int nValue)
    
{
        nType 
= SD_NUMBER;
        unValue.nNumber 
= nValue;
    }


    
void operator = (char *str)
    
{
        nType 
= SD_STRING;
        unValue.szString[
0= 0;

        
if (str != NULL)
        
{
            strncpy(unValue.szString, str, 
sizeof(unValue.szString));
        }

    }


    
void operator = ( SSDTable pT )
    
{
        nType 
= SD_TABLE;
        unValue.stTable.nNum 
= pT.nNum;
        unValue.stTable.pValue 
= (void *)pT.pValue;    
    }


}
;

struct ILuaScript
{    
    
/*
     *    @Param: szFileName - 脚本文件名
     *    @Return: NULL
     *    @Description: 调用一个脚本
     
*/

    
virtual bool CallFile(const char *szFileName) = 0;
    
    
/*
     *    @Param: szFuncName - 函数名 pIn, nInNum - 输入参数列表指针以及个数
     *    @Return: pRet, nRetNum - 返回参数列表指针以及个数
     *    @Description: 调用一个函数
     
*/

    
virtual bool CallFunction(const char *szFuncName, SScriptParamObj *pIn, 
                        
int nInNum,    SScriptParamObj *pRet, int nRetNum) = 0;
    
    
/*
     *    @Param: szString - 字符串指针
     *    @Return: NULL
     *    @Description: 调用一个字符串
     
*/

    
virtual bool CallString(const char *szString) = 0;

    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual void ShowLuaCallStack() = 0;    
}
;

struct ILuaManager
{
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual bool InitManager(IGameWorld* pGameWorld) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual ILuaScript* CreateScript() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual void Update(float fElapse) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 注意如果是自己卸载一个script,请自己
                      手工管理这个script的指针,manager析构
                      的时候,会自动析构所有的script
     
*/

    
virtual void UnlinkScript(ILuaScript* pScript) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual ILuaScript* GetScript(const char* szScriptName) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual void Release() = 0;
}
;
#endif

另外,还有一个高手写的binder,针对c++的object做了很好的封装,但我没有采用,因为我想要灵活一点的。
链接在下面,大家可以对比一下,给出评论
http://www.codeproject.com/KB/cpp/luaincpp.aspx

本文的下载文件

posted on 2010-05-04 17:27 zuhd 阅读(3372) 评论(6)  编辑 收藏 引用 所属分类: lua

评论

# re: 自己动手封装LuaEngine[未登录] 2010-05-04 22:51 megax

可是看看luatinker  回复  更多评论   

# re: 自己动手封装LuaEngine 2010-05-05 08:07 陈梓瀚(vczh)

我在做脚本引擎的同时也一直需要做封装的,于是如果你采用的封装风格跟我一样的话,你可以:

LuaScript script("lua script code here");
LuaFunc<int(string, string)> find(script, "find");
int index=find("lua script", “script”);

类似的例子在我的博客上你可以去看看。  回复  更多评论   

# re: 自己动手封装LuaEngine 2010-05-05 09:45 zuhd

@megax
貌似这个东东不能在linux下使用,需要自己DIY??  回复  更多评论   

# re: 自己动手封装LuaEngine 2010-05-05 09:47 zuhd

@陈梓瀚(vczh)
我这里的封装,不如说是脚本文件管理,我对template的使用没有到那个层次,呵呵  回复  更多评论   

# re: 自己动手封装LuaEngine 2010-05-05 17:56 陈昱(CY)

还是boost python、boost luabind强大啊,,,  回复  更多评论   

# re: 自己动手封装LuaEngine 2012-04-10 19:50 laybor

LuaTinker多好用啊  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理