tolua++初探(五)

前端之家收集整理的这篇文章主要介绍了tolua++初探(五)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
 <采用了单继承的类的导出>     这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。     只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。     先看实际的头文件inheritance.h,我把实现也写在了头文件里。

#ifndef _CLASS_INHERITANCE_H

@H_301_16@#define  _CLASS_INHERITANCE_H

 WIN32_LEAN_AND_MEAN

#include 
< windows.h > @H_301_16@string

typedef 
@H_301_16@enum

{

    AUICSNormal 
= 0,

    AUICSHover 
1

    AUICSPushed 
2

    AUICSDisabled 
3

    AUICSHide 
4

    AUICSFORCEDOWRD 
0xFFFFFFFF

}

AUIControlState;

@H_301_16@class  CAUIControl

{

@H_301_16@public
:

    
//should not be called from lua scripts

    CAUIControl():m_nID(-), m_state(AUICSNormal), m_bVisible(@H_301_16@true0.0f"")

    
{}

    
@H_301_16@virtual
~CAUIControl()

    

tolua

    @H_301_16@void
 SetID(@H_301_16@int nID){ m_nID  nID; }

    
 GetID()@H_301_16@return m_nID; }

    
 SetText(@H_301_16@char* szText){ m_strText  szText; }

    
@H_301_16@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(@H_301_16@bool bVisible){ m_bVisible  bVisible; }

    
 IsVisible() m_bVisible; }

    
 SetEnabled( bEnable){ m_bEnablebEnable; }

    
 IsEnabled() m_bEnable; }

    
 SetAlpha(@H_301_16@float fAlpha){ m_fAlphafAlpha; }

    
 GetAlpha() m_fAlpha; } Render() ;

    
 MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){@H_301_16@false;}@H_301_16@protected m_nID;

    AUIControlState m_state;

    
 m_bVisible;

    
 m_bEnable;

    POINT m_position;

    SIZE  m_size;

    
 m_fAlpha;

    std::
@H_301_16@string m_strText;

}
;

 CAUIButton :  @H_301_16@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[
];

}
@H_301_16@extern
 CAUIButton g_button;

@H_301_16@#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。     全局变量的导出很简单, @H_301_16@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

@H_301_16@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  @H_301_16@global  button

print(
global button test )

lbutton:SetAlpha(
0.5 )

print(lbutton:GetAlpha())

lbutton:SetID(
100 )

lbutton:SetText(
global button )

print(lbutton:GetText())

alloc  @H_301_16@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函数中对参数进行类型转换,然后呼叫其特定方法

猜你在找的Lua相关文章