游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: ACGFan

自制 lua C_API 的 c++封装

[复制链接]

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-27 12:10:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

请务必使用5.1的lua_API。link上lua5.1.lib,或加入如下文件
linklib.cpp:
#pragma comment(lib,"lua5.1.lib")

lua51.zip:http://pickup.mofile.com/0050013982541533

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-27 12:39:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

我最早也是用LuaWrap,后来希望更加直接,希望用更多功能,在luauser上看过不下十份cpp封装,最后变成现在这样的。我的出发点就是使用方便,比如:

lua:
tmp = the_table.get_name("left","right");或tmp = the_table["get_name"]("left","right")

cpp:
string tmp;
Set(tmp) = d.global["the_table"]["get_name"]("left","right");
//本来是d["the_table"]["get_name"],后来考虑到LUA_REGISTRYINDEX,改了。
两端调用很相似的。
如果用LuaWrap,就得多写不少。

另外类的封装:
我的:
namespace Test{
struct test_t
{
  int n;
  const test_t* ft(test_t& r){cout<<"f(test_t* r)\n";r.n = 55;return this;}
};
}

BEGIN_CLASS2LUA(::Test::test_t)
LUA_METHOD(ft)//或{"ft",FUN2LUA(&::Test::test_t::method)}
END_CLASS2LUA

这一段宏,不需要与类的文件写在一起,在任意.cpp内完成即可。(不写产生连接错误)

LuaWrap要加在类定义里,这样以后恐怕不方便,而且代码长。

42

主题

245

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-9-28 11:14:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

能你脚本封装能够做到这个效果吗?以下是LUA的调用过程

local System = getSingleton()
local root     = System :getRoot()
root:Set( 100,100 )

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-28 17:20:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

System是c++类还是Table ?
如果是c++类,就是
BEGIN_CLASS2LUA(System)
LUA_METHOD(getRoot)//或{"getRoot",FUN2LUA(&System::getRoot)}
END_CLASS2LUA

root类型同理。

如果是Table:
Domain d;
//....load script
Reference system( d.global["getSingleton"]() );
Reference getRoot( system["getRoot"]);
Reference root( (system->*getRoot)() );
Reference Set( root["Set"]);
(root->*Set)(100,100);

如果需要,我可以支持这样的语法(本来支持,后来删了):
(root->*"Set")(100,100);
root._("Set")(100,100);

42

主题

245

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-9-28 17:43:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

支持类的虚函数吗?纯虚呢?

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-29 09:13:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

直接支持,和支持POD类用法没有区别。目前不支持重载和const,不过勉强可以加入。
真正的限制是,所给参数必须是编译期常量。
我的宏FUN2LUA,用成员函数,或一般函数作参数。返回lua_CFunction。

class ITest
{
virtual void f1() = 0;
virtual void f2() = 0;
};


BEGIN_CLASS2LUA(ITest)
LUA_METHOD(f1),
LUA_METHOD(f2)
END_CLASS2LUA

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-29 09:49:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

#include <iostream>
#include <Dx\Lua.h>

using namespace std;
class ITest
{
public:
  virtual void say() = 0;
};

BEGIN_CLASS2LUA(ITest)
LUA_METHOD(say)
END_CLASS2LUA

class Test:public ITest
{
public:
  void say()
  {
    cout<<"ok saying\n";
  }
};

int __cdecl main()
{
  using namespace Dx;
  using namespace Dx:ua;

  try{
    Domain d;
    d.LoadFile("Test.lua");
    Test test;

    d["run_host"](UDTRef<ITest>(test));
    ITest& ref = test;
    d["run_host"](UDT(ref));

  }
  catch(Lua::ScriptError& e)
  {
    cerr<<"\n!!!catch a scrpt error:\n"<<e.what();
  }
        return 0;
}

test.lua
function run_host(test)
test:say()
end

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-29 09:50:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

output:

ok saying
ok saying

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-9-29 12:48:00 | 显示全部楼层

Re:自制 lua C_API 的 c++封装

更新代码:http://pickup.mofile.com/6666622011646627
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 12:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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