`
king_tt
  • 浏览: 2108470 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

tolua++初探(五)

 
阅读更多
<采用了单继承的类的导出> 这个……,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

    tolua++-1.0.93.tar.bz

    tolua++参考手册中文版-[刘源霖(译)].rar

    tolua++参考手册中文版-[刘源霖(译)] PDF格式 写的很详细 留给需要的人

    tolua++-1.0.92源码

    这是tolua++-1.0.92版本的源码,支持各种常用的平台。编译方法在自带的INSTALL中有描述。本人在windows7上用VS2012编译过,里面有二个工程,一个是编译生成tolua++.exe的,另一个是本人自己添加的,用来生成tolua++....

    tolua++ 编译 及使用 简单介绍

    tolua++ 编译 及使用 简单介绍 tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。

    tolua++ 1.0.92

    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 ...

    tolua++ tool test

    Lua c++ ,tolua++工具注册C++类

    lua和C++通过tolua++进行互调的demo

    lua和c++通过tolua++互调,内含有demo,以及tolua++.exe,lua5.1

    lua5.1.4类库和tolua++1.0.93类库及工具打包

    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编译器(Mac版)

    编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用

    tolua++编译pkg脚本工具及CurlDown源码

    tolua++编译pkg脚本工具及CurlDown源码,源码和工具在:toluapp-master\bin 目录下面,附tolua++ pkg脚本教程。

    toLUA++ 1.0.92

    tolua++ 源代码,希望各位大侠能够看懂,希望你们维护它,它很强

    tolua++1.0.93编译器 (win版)

    编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用

    tolua++ 1.0.93

    tolua++.exe 可执行,带liblua.dll,lua.dll

    tolua++ 版helloworld (lua脚本调用C++类的成员函数方法)

    关于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++示例程序

    tolua++源码

    tolua++的源码和代码生成工具,已经建好了项目,只要将新建解决方案,然后将项目加进去。当然你还是要自己将lua库和头文件链接过去

    tolua ++ 使用例子

    tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件. tolua使用例子.

    tolua++测试

    tolua++工具的测试,lua脚本测试. vs7编译。 包含完整编译环境,lib,inc.

    toLua++工具及易懂演示实例.zip

    使用tolua++ 工具导出c++文件到lua接口, 包含全部工具及演示代码,条理清晰,简单易懂。https://blog.csdn.net/u012278016/article/details/101269992

Global site tag (gtag.js) - Google Analytics