加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

tolua++初探(五)

发布时间:2020-12-14 22:27:42 所属栏目:大数据 来源:网络整理
导读:?采用了单继承的类的导出 ??? 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 ??? 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按
?<采用了单继承的类的导出> ??? 这个……,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函数中对参数进行类型转换,然后呼叫其特定方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读