<采用了单继承的类的导出>
这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。
只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。
先看实际的头文件inheritance.h,我把实现也写在了头文件里。
#ifndef_CLASS_INHERITANCE_H
#define_CLASS_INHERITANCE_H
#defineWIN32_LEAN_AND_MEAN
#include<windows.h>
#include<string>
typedefenum
...{
AUICSNormal=0,
AUICSHover=1,
AUICSPushed=2,
AUICSDisabled=3,
AUICSHide=4,
AUICSFORCEDOWRD=0xFFFFFFFF
}
AUIControlState;
classCAUIControl
...{
public:
//shouldnotbecalledfromluascripts
CAUIControl():m_nID(-1),m_state(AUICSNormal),m_bVisible(true),m_bEnable(true),m_fAlpha(0.0f),m_strText("")
...{}
virtual~CAUIControl()...{}
public:
//tolua
voidSetID(intnID)...{m_nID=nID;}
intGetID()...{returnm_nID;}
voidSetText(char*szText)...{m_strText=szText;}
constchar*GetText()...{returnm_strText.c_str();}
voidSetPosition(POINTpt)...{m_position=pt;}
POINTGetPosition()...{returnm_position;}
voidSetSize(SIZEsz)...{m_size=sz;}
SIZEGetSize()...{returnm_size;}
voidSetVisible(boolbVisible)...{m_bVisible=bVisible;}
boolIsVisible()...{returnm_bVisible;}
voidSetEnabled(boolbEnable)...{m_bEnable=bEnable;}
boolIsEnabled()...{returnm_bEnable;}
voidSetAlpha(floatfAlpha)...{m_fAlpha=fAlpha;}
floatGetAlpha()...{returnm_fAlpha;}
public:
//shouldnotbecalledfromluascripts
virtualvoidRender()=0;
virtualboolMsgProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)...{returnfalse;}
protected:
intm_nID;
AUIControlStatem_state;
boolm_bVisible;
boolm_bEnable;
POINTm_position;
SIZEm_size;
floatm_fAlpha;
std::stringm_strText;
};
classCAUIButton:publicCAUIControl
...{
public:
CAUIButton():m_pTexture(NULL)
...{}
virtual~CAUIButton()...{}
public:
voidSetTexture(char*szFile)...{}
voidSetTextureRects(constRECT&rcNormal,constRECT&rcHover,constRECT&rcPushed,constRECT&rcDisabled)...{}
voidSetAlpha(floatfAlpha)...{m_fAlpha=fAlpha;printf("CAUIButton::SetAlpha,extraprocesshere! ");}
public:
voidRender()...{printf("CAUIButton::Render ");}
boolMsgProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)...{printf("CAUIButton::MsgProc ");returnfalse;}
protected:
void*LoadTexture(char*szTextureFile)...{returnNULL;}
void*m_pTexture;
RECTm_rects[4];
};
externCAUIButtong_button;
#endif
g_button的实例定义在main函数所在的文件中。
下面是inheritance.pkg文件:
$#include"inheritance.h"
classCAUIControl
...{
public:
//tolua
voidSetID(intnID);
intGetID();
voidSetText(char*szText);
constchar*GetText();
voidSetPosition(POINTpt);
POINTGetPosition();
voidSetSize(SIZEsz);
SIZEGetSize();
voidSetVisible(boolbVisible);
boolIsVisible();
voidSetEnabled(boolbEnable);
boolIsEnabled();
voidSetAlpha(floatfAlpha);
floatGetAlpha();
};
classCAUIButton:publicCAUIControl
...{
public:
CAUIButton();
virtual~CAUIButton();
public:
voidSetTexture(char*szFile);
voidSetTextureRects(constRECT&rcNormal,constRECT&rcHover,constRECT&rcPushed,constRECT&rcDisabled);
voidSetAlpha(floatfAlpha);
};
externCAUIButtong_button@lbutton;
对于基类CAUIControl,只导出部分方法,不导出构造函数,不允许在Lua中直接生成其实例。派生类CAUIButton可以在lua中生成实例。CAUIButton重写了基类的SetAlpha函数也增加了一些新的函数,如设置纹理函数SetTexture。
全局变量的导出很简单,
externCAUIButtong_button@lbutton;一个语句就可以了。我们还可以为其加上tolua_readonly修饰符。我把它重名为lbutton。
好了,下面用tolua++.exe生成inherit.cpp文件:
tolua++.exe-ninherit-oinherit.cppinheritance.pkg
接下来是驱动文件inheritance.cpp:
#include"lua.hpp"
#include"inheritance.h"
inttolua_inherit_open(lua_State*);
CAUIButtong_button;
int_tmain(intargc,_TCHAR*argv[])
...{
lua_State*L=luaL_newstate();
luaopen_base(L);
tolua_inherit_open(L);
luaL_dofile(L,"../scripts/inheritance.lua");
lua_close(L);
return0;
}
相当简单,和前面几个几乎一样,唯一变化的是多了个全局变量。
最后是inheritance.lua文件:
print("nowininheritance.lua!")
--accessglobalbutton
print("globalbuttontest")
lbutton:SetAlpha(0.5)
print(lbutton:GetAlpha())
lbutton:SetID(100)
lbutton:SetText("globalbutton")
print(lbutton:GetText())
--allocnewbutton
newbutton=CAUIButton:new()
--CAUIControl'smethods
newbutton:SetID(101)
print(newbutton:GetID())
newbutton:SetText("newbutton")
print(newbutton:GetText())
--CAUIButton'sSetAlpha
newbutton:SetAlpha(0.7)
print(newbutton:GetAlpha())
大功告成了,几乎没有任何新意。不过还是验证了一点东西,仅此而已。
接下来要演示如何呼叫lua脚本中的函数,并向其传递参数,在该lua函数中对参数进行类型转换,然后呼叫其特定方法。
分享到:
相关推荐
tolua++-1.0.93.tar.bz
tolua++参考手册中文版-[刘源霖(译)] PDF格式 写的很详细 留给需要的人
这是tolua++-1.0.92版本的源码,支持各种常用的平台。编译方法在自带的INSTALL中有描述。本人在windows7上用VS2012编译过,里面有二个工程,一个是编译生成tolua++.exe的,另一个是本人自己添加的,用来生成tolua++....
tolua++ 编译 及使用 简单介绍 tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。
tolua++-1.0.92 源码 tolua++ is an extended version of tolua, a tool to integrate C/C++ code with Lua. tolua++ includes new features oriented to c++ such as: Support for std::string as a basic type ...
Lua c++ ,tolua++工具注册C++类
lua和c++通过tolua++互调,内含有demo,以及tolua++.exe,lua5.1
lua5.1.4类库和tolua++1.0.93类库及工具打包 使用CodeBlocks 8.02 gcc 3.4.5编译的 lua 5.1.4 tolua++ 1.0.93 文件列表 liblua.a,libtolua++.a,lua51.dll,lua.exe,luac.exe,tolua++.exe
编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用
tolua++编译pkg脚本工具及CurlDown源码,源码和工具在:toluapp-master\bin 目录下面,附tolua++ pkg脚本教程。
tolua++ 源代码,希望各位大侠能够看懂,希望你们维护它,它很强
编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用
tolua++.exe 可执行,带liblua.dll,lua.dll
关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,Main.cpp ,build_pgk.bat 1.启动CodeBlocks...
本文是tolua++学习的入门教程,包括tolua++简介、tolua++资源文件编译 tolua++示例程序
tolua++的源码和代码生成工具,已经建好了项目,只要将新建解决方案,然后将项目加进去。当然你还是要自己将lua库和头文件链接过去
tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件. tolua使用例子.
tolua++工具的测试,lua脚本测试. vs7编译。 包含完整编译环境,lib,inc.
使用tolua++ 工具导出c++文件到lua接口, 包含全部工具及演示代码,条理清晰,简单易懂。https://blog.csdn.net/u012278016/article/details/101269992