tolua++初探(五)
发布时间:2020-12-14 22:27:42 所属栏目:大数据 来源:网络整理
导读:?采用了单继承的类的导出 ??? 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 ??? 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按
?<采用了单继承的类的导出> ??? 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 ??? 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。 ??? 先看实际的头文件inheritance.h,我把实现也写在了头文件里。
??? 对于基类CAUIControl,只导出部分方法,不导出构造函数,不允许在Lua中直接生成其实例。派生类CAUIButton可以在lua中生成实例。CAUIButton重写了基类的SetAlpha函数也增加了一些新的函数,如设置纹理函数SetTexture。 ??? 全局变量的导出很简单,
extern
?CAUIButton?g_button@lbutton;一个语句就可以了。我们还可以为其加上tolua_readonly修饰符。我把它重名为lbutton。 ??? 好了,下面用tolua++.exe生成inherit.cpp文件:
#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
$#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;
????tolua
++
.exe?
-
n?inherit?
o?inherit.cpp?inheritance.pkg
#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函数中对参数进行类型转换,然后呼叫其特定方法。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |