游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10852|回复: 11

如何在LUA中调用C++的类成员函数

[复制链接]

97

主题

590

帖子

590

积分

高级会员

Rank: 4

积分
590
QQ
发表于 2007-7-29 21:50:00 | 显示全部楼层 |阅读模式
初学LUA,了解了基本语法,知道LUA调用C函数必须是int func(lua_State*)的形式,虽然可以通过这个参数得到脚本中的参数,并在C中运用,不过游戏中都是类成员函数,比如bool MyClass::FadeIn(int)这个函数我程序中其他地方要调用,又需要在LUA脚本中调用,现在我的办法是再写一个函数
int FadeIn(lua_State* L)
{
   int arg=lua_tonumber(L,1)
   myclass::FadeIn(arg);
   return 0;
}

这样子很不方便,而且只能调用类静态函数,听说有个Luabind和lua wrapper for c++,但是刚接触LUA,又要来个LUABIND,,我只需要其中一个功能而已,所以求一个简单的不使用其他库的办法.先谢了
[em13]

1

主题

30

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2007-7-30 17:56:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

cpp文件:

using namespace std;


class obj
{
public:
        obj() : val( 0 ) {}

        void   set( double v ) { val = v;    }
        double get( void )     { return val; }

private:
        double val;
};

class lua_bind
{
public:
        static void reg( lua_State* lua )
        {
                lua_newtable( lua );
                int tbl = lua_gettop( lua );

                luaL_newmetatable( lua, "obj" );
                int meta_tbl = lua_gettop( lua );

                lua_pushliteral( lua, "__metatable" );
                lua_pushvalue( lua, tbl );
                lua_settable( lua, meta_tbl );

                lua_pushliteral( lua, "__index" );
                lua_pushvalue( lua, tbl );
                lua_settable( lua, meta_tbl );

                lua_pushliteral( lua, "__gc" );
                lua_pushcfunction( lua, gc );
                lua_settable( lua, meta_tbl );

                lua_pop( lua, 1 );
                luaI_openlib( lua, 0, functions, 0 );

                lua_pop( lua, 1 );
                lua_register( lua, class_name, build );
        }

        static int build( lua_State* lua )
        {
                obj* p = new obj();
                *( void** )( lua_newuserdata( lua, sizeof( void* ) ) ) = p;

                luaL_getmetatable( lua, class_name );
                lua_setmetatable( lua, -2 );

                cout << "build object, val is 0" << endl;
                return 1;
        }

        static int gc( lua_State* lua )
        {
                obj* p = ( obj* )( *( void** )( lua_touserdata( lua, 1 ) ) );
                delete p;

                cout << "object gc" << endl;
                return 0;
        }

        static int set_val( lua_State* lua )
        {
                obj* p = ptr( lua, 1 );
                double val = luaL_checknumber( lua, 2 );

                p->set( val );

                cout << "set value to " << val << endl;
                return 0;
        }

        static int get_val( lua_State* lua )
        {
                obj* p = ptr( lua, 1 );
                double val = p->get();

                lua_pushnumber( lua, val );

                cout << "get value is " << val << endl;
                return 1;
        }

        static obj* ptr( lua_State* lua, int narg )
        {
                luaL_checktype( lua, narg, LUA_TUSERDATA );
                void* ud = luaL_checkudata( lua, narg, class_name );

                if( ud )
                        return *( obj** )ud;

                luaL_typerror( lua, narg, class_name );
                return 0;
        }

        static const char     class_name[];
        static const luaL_reg functions[];
};

const char lua_bind::class_name[] = "obj";

const luaL_reg lua_bind::functions[] =
{
        { "set", lua_bind::set_val },
        { "get", lua_bind::get_val },
        {     0,                 0 }
};



void test0x( lua_State* lua )
{
        lua_bind::reg( lua );

        luaL_dofile( lua, "script0x.lua" );
}


脚本文件:

o = obj();

o:set( 50 );
o:get();

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
发表于 2007-7-30 20:15:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

建议楼主下个LuaPlus来看看,好用而且健壮的LUA FOR C++封装库.

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-7-31 00:08:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

用luabind,我们公司做项目都用到了

0

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2007-8-21 14:06:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

不错不错

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-8-21 16:33:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

何不换个脚本语言?试试angelscript

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2007-8-21 20:59:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

python

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-22 14:24:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

luaplushelper 看下你就会了

97

主题

590

帖子

590

积分

高级会员

Rank: 4

积分
590
QQ
 楼主| 发表于 2008-1-28 13:22:00 | 显示全部楼层

Re: Re:如何在LUA中调用C++的类成员函数

航天奇侠: Re:如何在LUA中调用C++的类成员函数

python

python需要导出DLL才行,我现在游戏里比如有个类Car:rive(float speed),脚本要用它,我就必须新建一个DLL工程,然后在DLL中复制一遍这个函数才行. 那不是要烦死人.

一般脚本在C++中是这么写的:
MessageProcess(Msg)
{
    switch(msg)
    {
    case CarDrive:
         float speed= mScript->Read();
         mCar->Drive(speed);
         break;
...........
    }

}

97

主题

590

帖子

590

积分

高级会员

Rank: 4

积分
590
QQ
 楼主| 发表于 2008-1-28 13:23:00 | 显示全部楼层

Re:如何在LUA中调用C++的类成员函数

不知道LUABIND和LUAPLUS哪个好用呀,决定还是用LUA做游戏脚本了,PYTHON调用机制太繁琐
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 23:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表