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

/*
* @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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值