概述 <采用了单继承的类的导出> 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。 先看实际的头文件inherita <采用了单继承的类的导出> 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。 先看实际的头文件inheritance.h,我把实现也写在了头文件里。
#ifndef _CLASS_inheritANCE_H #define _CLASS_inheritANCE_H WIN32_LEAN_AND_MEAN #include < windows.h > string typedef enum ... { AUICSnormal = 0, AUICSHover 1 AUICSPushed 2 AUICSDisabled 3 AUICSHIDe 4 AUICSFORCEDOWRD 0xFFFFFFFF } AUIControlState; class CAUIControl ... { public: //should not be called from lua scripts CAUIControl():m_nID(-), m_state(AUICSnormal), m_bVisible(true0.0f"") ...{} virtual~CAUIControl()... tolua voID SetID(int nID)...{ m_nID nID; } GetID()...{ return m_nID; } SetText(char* szText)...{ m_strText szText; } const GetText()... m_strText.c_str(); } Setposition(POINT pt)...{ m_position pt; } POINT Getposition()... m_position; } SetSize(SIZE sz)...{ m_size sz; } SIZE GetSize()... m_size; } SetVisible(bool bVisible)...{ m_bVisible bVisible; } IsVisible()... m_bVisible; } SetEnabled( bEnable)...{ m_bEnablebEnable; } IsEnabled()... m_bEnable; } SetAlpha(float fAlpha)...{ m_fAlphafAlpha; } GetAlpha()... m_fAlpha; } Render() ; MsgProc(HWND hWnd, UINT uMsg, WParaM wParam, LParaM lParam)...{false;}protected m_nID; AUIControlState m_state; m_bVisible; m_bEnable; POINT m_position; SIZE m_size; m_fAlpha; std::string m_strText; } ; CAUIbutton : public CAUIControl ... : CAUIbutton():m_pTexture(NulL) ... CAUIbutton()...: SetTexture( szfile)... SetTextureRects( RECT & rcnormal, rcHover,0);">rcpushed,0);"> RECT rcDisabled)... ...{ m_fAlpha fAlpha; printf("CAUIbutton::SetAlpha, extra process here! ); }: Render()...{printf(CAUIbutton::Render );} ...{ printf(CAUIbutton::MsgProc ); : LoadTexture( szTexturefile)... NulL;} m_pTexture; RECT m_rects[]; } extern CAUIbutton g_button; #endif g_button的实例定义在main函数所在的文件中。 下面是inheritance.pkg文件: $#include " inheritance.h CAUIControl ... nID); GetID(); szText); GetText(); Setposition(POINT pt); POINT Getposition(); SetSize(SIZE sz); SIZE GetSize(); bVisible); IsVisible(); bEnable); IsEnabled(); fAlpha); GetAlpha(); } CAUIControl ... : CAUIbutton(); CAUIbutton(); szfile); rcDisabled); fAlpha); } CAUIbutton g_button@lbutton; 对于基类CAUIControl,只导出部分方法,不导出构造函数,不允许在Lua中直接生成其实例。派生类CAUIbutton可以在lua中生成实例。CAUIbutton重写了基类的SetAlpha函数也增加了一些新的函数,如设置纹理函数SetTexture。 全局变量的导出很简单, extern CAUIbutton g_button@lbutton;一个语句就可以了。我们还可以为其加上tolua_Readonly修饰符。我把它重名为lbutton。 好了,下面用tolua++.exe生成inherit.cpp文件: tolua ++ .exe - n inherit o inherit.cpp inheritance.pkg 接下来是驱动文件inheritance.cpp: #include " lua.hpp #include inheritance.h int tolua_inherit_open(lua_State * ); CAUIbutton g_button; _tmain( argc, _TCHAR argv[]) ... { lua_State L luaL_newstate(); luaopen_base(L); tolua_inherit_open(L); luaL_dofile(L,0);">../scripts/inheritance.lua); lua_close(L); ; } 相当简单,和前面几个几乎一样,唯一变化的是多了个全局变量。 最后是inheritance.lua文件: print( Now in inheritance.lua! ) -- access global button print( global button test ) lbutton:SetAlpha( 0.5 ) print(lbutton:GetAlpha()) lbutton:SetID( 100 ) lbutton:SetText( global button ) print(lbutton:GetText()) alloc new button newbutton = CAUIbutton: () CAUIControl ' s methods newbutton:SetID( 101 ) print(newbutton:GetID()) newbutton:SetText( new button ) print(newbutton:GetText()) CAUIbutton s SetAlpha newbutton:SetAlpha( 0.7 ) print(newbutton:GetAlpha()) 大功告成了,几乎没有任何新意。不过还是验证了一点东西,仅此而已。 接下来要演示如何呼叫lua脚本中的函数,并向其传递参数,在该lua函数中对参数进行类型转换,然后呼叫其特定方法。 总结 以上是内存溢出为你收集整理的tolua++初探(五)全部内容,希望文章能够帮你解决tolua++初探(五)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)