/*
* @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
本文介绍了一个自定义按钮封装方案,支持CCMenu批量管理。该方案包括xButton、xButtonMenu和xButtonTouchDelegate三个核心类,实现了按钮的创建、添加及触碰事件处理等功能。
1002

被折叠的 条评论
为什么被折叠?



