您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 自定义按钮封装(支持CCMenu批量管理),很久以前的代码

2014-07-28 11:02 507 查看
/*
* @note		:自定义按钮封装(支持CCMenu批量管理)
* @author	:Andy.Ro
* @email	:Qwuloo@qq.com
*/
#ifndef _XBUTTON_H_INCLUDE_
#define _XBUTTON_H_INCLUDE_

#include "cocos2d.h"
#include <iostream>

class xButton;
class xButtonTouchDelegate;

//------------------------------------------------------------------------
// xButtonMenu
//------------------------------------------------------------------------
class xButtonMenu : public cocos2d::CCObject
{
protected:
xButtonMenu(xButtonTouchDelegate* sender);
public:
// @note:实例化
static xButtonMenu* create(xButtonTouchDelegate* sender);
// @note:添加按钮
bool addButton(
char const* normal
,char const* selected
,char const* disabled
,unsigned nID = 0);
// @note:添加按钮
bool addButton(
cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,unsigned nID = 0);
// @note:关联各按钮到菜单并返回
cocos2d::CCMenu* toButtonMenu(void);
protected:
// @note:初始化
bool initButtonArray(void);
// @note:触碰事件
void onTouch(cocos2d::CCObject* sender);
// @note:设置代理
void setDelegate(xButtonTouchDelegate* sender);
protected:
//@note:按钮组
cocos2d::CCArray* buttonArray;

//@note:触碰代理
xButtonTouchDelegate* target;
public:
virtual ~xButtonMenu(void);
};

//------------------------------------------------------------------------
// xButton
//------------------------------------------------------------------------
class xButton : public cocos2d::CCMenuItemImage
{
friend class xButtonMenu;
protected:
xButton(unsigned nID);
static xButton* create(
unsigned nID
,char const* normal
,char const* selected
,char const* disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector);
static xButton* create(
unsigned nID
,cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector);
bool initWithImages(
char const* normal
,char const* selected
,char const* disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector);
bool initWithImages(
cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector);
protected:
// @note:触碰事件
virtual void onTouch(xButtonTouchDelegate* sender);
public:
// @note:返回控件ID
unsigned ctrlID(void);
private:
// 控件ID
unsigned m_nID;
public:
virtual ~xButton(void);
};

//------------------------------------------------------------------------
// xButtonTouchDelegate
//------------------------------------------------------------------------
class xButtonTouchDelegate
{
public:
virtual void onTouch(cocos2d::CCObject* sender) = 0;
};

#endif // _XBUTTON_H_INCLUDE_


/*
* @note		:自定义按钮封装(支持CCMenu批量管理)
* @author	:Andy.Ro
* @email	:Qwuloo@qq.com
*/
#include "xButton.h"

#include <iostream>
using namespace std;

USING_NS_CC;

//------------------------------------------------------------------------
// xButtonMenu
//------------------------------------------------------------------------
xButtonMenu::xButtonMenu(xButtonTouchDelegate* sender)
:buttonArray(NULL)
,target(sender)
{

}

xButtonMenu* xButtonMenu::create(xButtonTouchDelegate* sender)
{
xButtonMenu* s = new xButtonMenu(sender);
if ( s && s->initButtonArray() )
{
s->autorelease();
}
else CC_SAFE_DELETE( s );
return s;
}

void xButtonMenu::setDelegate(xButtonTouchDelegate* sender)
{
CC_ASSERT( sender ); this->target = sender;
}

bool xButtonMenu::initButtonArray(void)
{
CC_SAFE_RELEASE_NULL( this->buttonArray );
this->buttonArray = CCArray::create(); CC_ASSERT( this->buttonArray );
CC_SAFE_RETAIN( this->buttonArray );
return true;
}

bool xButtonMenu::addButton(
char const* normal
,char const* selected
,char const* disabled
,unsigned nID)
{
CC_ASSERT( this->buttonArray );
xButton* s = xButton::create(
nID
,normal
,selected
,disabled
,this // 触发当前类onTouch调用
,menu_selector(xButtonMenu::onTouch)); CC_ASSERT( s );
CC_SAFE_RETAIN( s );
this->buttonArray->addObject( s );
CC_SAFE_RELEASE( s );
return true;
}

bool xButtonMenu::addButton(
cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,unsigned nID)
{
CC_ASSERT( this->buttonArray );
xButton* s = xButton::create(
nID
,normal
,selected
,disabled
,this // 触发当前类onTouch调用
,menu_selector(xButtonMenu::onTouch)); CC_ASSERT( s );
CC_SAFE_RETAIN( s );
this->buttonArray->addObject( s );
CC_SAFE_RELEASE( s );
return true;
}

//@brief 通过菜单项创建按钮菜单
CCMenu* xButtonMenu::toButtonMenu(void)
{
CC_ASSERT( this->buttonArray );
return CCMenu::createWithArray( this->buttonArray );
}

void xButtonMenu::onTouch(cocos2d::CCObject* sender)
{
//	cout<< "Call xButtonMenu::onTouch()"<<endl;
CC_ASSERT( sender );
CC_ASSERT( dynamic_cast<xButton*>(sender) );
CC_ASSERT( this->target );
// 获取按钮对象
xButton* button = dynamic_cast<xButton*>(sender);
// 触发代理onTouch调用
this->target->onTouch(button);
// 触发按钮onTouch调用
button->onTouch(this->target);
}

xButtonMenu::~xButtonMenu(void)
{
CC_SAFE_RELEASE_NULL( this->buttonArray );

} // class xButtonMenu

//------------------------------------------------------------------------
// xButton
//------------------------------------------------------------------------
xButton::xButton(unsigned nID)
:m_nID(nID)
{

}

xButton* xButton::create(
unsigned nID
,char const* normal
,char const* selected
,char const* disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector)
{
xButton* s = new xButton(nID);
if ( s && s->initWithImages(
normal
,selected
,disabled
,target
,selector) )
{
s->autorelease();
}
else CC_SAFE_DELETE( s );
return s;
}

xButton* xButton::create(
unsigned nID
,cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector)
{
xButton* s = new xButton(nID);
if ( s && s->initWithImages(
normal
,selected
,disabled
,target
,selector) )
{
s->autorelease();
}
else CC_SAFE_DELETE( s );
return s;
}

bool xButton::initWithImages(
char const* normal
,char const* selected
,char const* disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector)
{
if ( !this->initWithNormalImage(
normal
,selected
,disabled
,target
,selector) )
{
return false;
}
return true;
}

bool xButton::initWithImages(
cocos2d::CCSprite* const& normal
,cocos2d::CCSprite* const& selected
,cocos2d::CCSprite* const& disabled
,cocos2d::CCObject* target
,cocos2d::SEL_MenuHandler selector)
{
if ( !this->initWithNormalSprite(
normal
,selected
,disabled
,target
,selector) )
{
return false;
}
return true;
}

void xButton::onTouch(xButtonTouchDelegate* sender)
{
//	cout<< "Call xButton::onTouch()"<<endl;
}

// @brief 返回控件ID
unsigned xButton::ctrlID(void)
{
return this->m_nID;
}

xButton::~xButton(void)
{
} // class xButton
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐