游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4193|回复: 4

使用c++类导入至lua

[复制链接]

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2008-2-20 12:12:00 | 显示全部楼层 |阅读模式
查找了网上的许多C++邦定的库,不是太大,太复杂,就是过于简单。

tolua++  需要2次生成代码,放弃..

luabind  需要使用boost ,过于庞大,加之本人对于boost库研究甚少,放弃..

MLuaBind 使用loki库,也过于复杂,并且还是小版本号,不敢用..

最后发现2个 easylua 和 luaplus ,但是还是有其缺点



easylua实现都是使用了luaL_ref 感觉不爽。并且无法导出多余一个参数的类成员函数



class MyClass

{

...

virtual int XX(const char * p ,const char *p2) ;

...

}



无法导出,怎么也调试不过,望各位大虾赐教 ^ ^





luaplus  是基于lua源代码更改,带来的问题是无法和官方发布的新版同步,内涵bug也就无法保证。



为了使用上的方便,不得不结合2个重写了一个简单适用的工具头文件。
文件获取连接:
http://pickup.mofile.com/1928676753022483


使用方法:

main.cpp



  1. #include "LuaPlusCD.h"



  2. class ObjectAAA
  3. {
  4. public:
  5. ObjectAAA(){}
  6. void Print2(int num,const char *pp,const char* p3)
  7. {
  8.   cout<<"ObjectAAA::Print2: "<<p3<<endl;
  9. }

  10. static ObjectAAA* CreateInstance()
  11. {
  12.   ObjectAAA* p = new ObjectAAA();
  13.   cout<<"CreateInstance:"<<p<<"\n";
  14.   return p;
  15. }

  16. int m_num;

  17. LUA_EXPOSED(ObjectAAA)
  18. };

  19. LUA_EXPOSED_CLASS(ObjectAAA)
  20. LUA_REGISTER_RET_PTR_CALL(ObjectAAA)



  21. //LUA_REGISTER_RET_PTR_CALL 是为了在类的成员函数返回这个对象的指针时,自动压入USERDATA,是一个模板的偏特化


  22. LUA_EXPOSED_START(ObjectAAA)
  23. LUA_EXPOSE( "Print2", Print2 )
  24. LUA_EXPOSE_STATIC("CreateInstance",CreateInstance)
  25. LUA_EXPOSED_END(ObjectAAA)



  26. int main(void)
  27. {

  28.   lua_State* L;
  29. /* initialize Lua */
  30.     L = lua_open();
  31. luaL_openlibs(L);
  32.    

  33. //注册 ObjectAAA 到lua内, lua 脚本中的ObjectAAA是一个工厂,并且不能调用非static成员函数
  34. ObjectAAA::RegisterClass(L);


  35.   int rc = luaL_loadstring(L," ha1 = ObjectAAA:CreateInstance() ha1:Print2(3,'3','3')  "
  36.         "ha2 = ha1:CreateInstance() ha2:Print2(4,'4','4')");
  37.         if (rc) {
  38.      cerr<<lua_tostring(L, -1)<<endl;
  39.        lua_pop(L, 1);
  40.         lua_close(L);
  41.     return 0;
  42.      }
  43.         
  44. rc = lua_pcall (L, 0, 0, 0);
  45.    if (rc)
  46.    {
  47.        cerr<<lua_tostring(L, -1)<<endl;
  48.        lua_pop(L, 1);  
  49.             
  50.    }

  51. lua_close(L);

  52. return 0;

  53. }

复制代码


优势:

达到简单可用,浏览一遍即可完全理解。

能够随意使用virtual函数。



限制:

类的成员函数不能使用stl作为参数和返回值。

由于是userdata所以对于不能__newindex

对于数据成员的赋值和存取没有解决,

#define LUA_EXPOSE_PROPERTY_SET( NAME, ITEM )   lpcd_pushmemberpropertysetclosure(pLua,&LOCALCLASS::ITEM, 0);   lua_setfield(pLua, -2, NAME );

#define LUA_EXPOSE_PROPERTY_GET( NAME, ITEM )   lpcd_pushmemberpropertygetclosure(pLua,&LOCALCLASS::ITEM, 0);   lua_setfield(pLua, -2, NAME );

无法正常工作







1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2008-2-20 12:14:00 | 显示全部楼层

a

不知道如何上传源码文件,有没有人指教下?

6

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2008-2-21 14:06:00 | 显示全部楼层

Re: 使用c++类导入至lua

做的不错。开个网络硬盘,然后给出连接。

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-2-21 14:07:00 | 显示全部楼层

Re:使用c++类导入至lua

您对Lua很熟悉吗?我们想高薪聘用这方面的人才,有时间的话可以聊聊。
我的QQ:9036561
邮箱:zhaogang@hipihi.com
hipihi公司:www.hipihi.com

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2008-2-22 12:41:00 | 显示全部楼层

Re:使用c++类导入至lua

多谢提醒
文件获取连接:
http://pickup.mofile.com/1928676753022483

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 04:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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