Cocos2dx下,自己封装的一个按钮
typedef void (CCObject::*ButtonClick_Func)();
typedef void (CCObject::*ButtonClick_FuncN)(CCObject* obj);
typedef void (CCObject::*ButtonClick_FuncND)(CCObject* obj,void* param);
#define click_selector(_SELECTOR) (ButtonClick_Func)(&_SELECTOR)
#define click_selectorN(_SELECTOR) (ButtonClick_FuncN)(&_SELECTOR)
#define click_selectorND(_SELECTOR) (ButtonClick_FuncND)(&_SELECTOR)
//
// ButtonSprite.h
// Zuma_V4
//
// Created by user on 13-1-28.
//
//
#ifndef __Zuma_V4__ButtonSprite__
#define __Zuma_V4__ButtonSprite__
#include <iostream>
#include "CallBack.h"
#include "cocos2d.h"
using namespace cocos2d;
class ButtonSprite : public CCSprite,public CCTouchDelegate
{
// touch 事件优先级
int m_touchPriority;
bool m_isDown;
// update 2013-02-17
// click handle
ButtonClick_Func m_BtnClick_Func;
// int param;
public:
ButtonSprite();
virtual ~ButtonSprite();
//
// update 2013-02-17
// 调整按钮的默认优先级,设置为最高优先级
static ButtonSprite* createButtonSprite(const char* fileName,int tPriority = kCCMenuHandlerPriority);
static ButtonSprite* createButtonSpriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame,int tPriority = kCCMenuHandlerPriority);
/* 触摸相关 */
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
// optional
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
//update 2013-02-17
void clicked();
void setOnClickListener(ButtonClick_Func tBtnClickFunc);
};
#endif /* defined(__Zuma_V4__ButtonSprite__) */
//
// ButtonSprite.cpp
// Zuma_V4
//
// Created by user on 13-1-28.
//
//
#include "ButtonSprite.h"
/**********************************************
构造函数和析构函数
**********************************************/
ButtonSprite::ButtonSprite():m_isDown(false)
{
m_touchPriority = 0;
m_BtnClick_Func = 0;
}
ButtonSprite::~ButtonSprite(){};
void ButtonSprite::onEnter(){
CCSprite::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,m_touchPriority, true);
};
void ButtonSprite::onExit(){
CCSprite::onExit();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
};
bool ButtonSprite::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);
if (boundingBox().containsPoint(touchPoint) && !m_isDown) {
m_isDown = true;
return true;
}
return false;
};
// optional
void ButtonSprite::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){
CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);
float deltaX = pTouch->getDelta().x;
deltaX = deltaX > 0 ? deltaX : -deltaX;
if (!boundingBox().containsPoint(touchPoint) || !m_isDown || deltaX > 15) {
m_isDown = false;
return;
}
};
void ButtonSprite::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){
CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);
if (boundingBox().containsPoint(touchPoint) && m_isDown) {
/* 相当于产生了click事件 */
if (m_BtnClick_Func) {
//来个点击效果
CCActionInterval* sAction = CCScaleTo::create(0.1, 1.2);
CCActionInterval* sAction2 = CCScaleTo::create(0.1, 1);
CCCallFunc* callFun = CCCallFunc::create(this,callfunc_selector(ButtonSprite::clicked));
runAction(CCSequence::create(sAction,sAction2,callFun,NULL));
}
m_isDown = false;
}
};
void ButtonSprite::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){
m_isDown = false;
};
ButtonSprite* ButtonSprite::createButtonSprite(const char* fileName,int tPriority)
{
ButtonSprite* button = new ButtonSprite();
button->m_touchPriority = tPriority;
if (button && button->initWithFile(fileName)) {
button->autorelease();
return button;
}
CC_SAFE_DELETE(button);
return button;
}
ButtonSprite* ButtonSprite::createButtonSpriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame,int tPriority)
{
ButtonSprite *pobSprite = new ButtonSprite();
pobSprite->m_touchPriority = tPriority;
if (pSpriteFrame && pobSprite && pobSprite->initWithSpriteFrame(pSpriteFrame))
{
pobSprite->autorelease();
return pobSprite;
}
CC_SAFE_DELETE(pobSprite);
return NULL;
}
//
// update
void ButtonSprite::setOnClickListener(ButtonClick_Func tBtnClickFunc)
{
m_BtnClick_Func = tBtnClickFunc;
}
void ButtonSprite::clicked()
{
(this->*m_BtnClick_Func)();
}
使用方式:
void MainMenu::onEnter()
{
CCLayer::onEnter();
ButtonSprite* playBtn = ButtonSprite::createButtonSprite("play.png");
playBtn->setPosition(ccp(240, 400));
playBtn->setOnClickListener(click_selector(MainMenu::btnCall));
addChild(playBtn);
}
void MainMenu::btnCall()
{
CCLog("[MainMenu::btnCall()]");
}
分享到:
相关推荐
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
此外,cocos2d-x的事件系统也是其核心特性之一。它允许开发者方便地处理触摸、键盘、鼠标等各种输入事件,构建出响应性强的交互界面。同时,它的动作(Actions)和动画(Animations)系统,让开发者能够轻松实现复杂...
Cocos2d是一款开源的游戏开发框架,被广泛用于创建2D游戏、演示程序和其他互动内容。在Android平台上,Cocos2d-x是一个基于C++的版本,提供了原生的编程接口,同时也支持Java API,方便Android开发者使用。"cocos2d-...
《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...
cocos2d-android游戏引擎是著名游戏引擎cocos2d游戏引擎的Android版。cocos2d-android游戏引擎性能优越、易学、可以进行纯java编程、具有极高的研 究价值、大大的降低了开发者的学习成本。您只需要一台普通配置的...
【cocos2d-x API中文文档】是一份详尽的资料,主要涵盖了cocos2d-x游戏引擎的API,这份文档适用于2015年的最新版本。cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者...
cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...
《cocos2d-x 3.8:经典游戏引擎源码解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这...
《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...
该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...
"cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...
《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...
### cocos2d-iphone至cocos2d-html5移植之旅:深入解析与实践指南 #### 引言 在数字化时代,跨平台游戏开发成为了一种趋势,尤其在移动设备和网页端之间的转换变得日益频繁。《cocos2d-iphone至cocos2d-html5移植...
《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...
Cocos2d是一个开源的游戏开发框架,而Cocos2d-x是它的C++版本,主要应用于移动设备。本文将深入探讨Cocos2d-html5,它是一个基于HTML5的版本,允许开发者使用JavaScript进行游戏开发,非常适合那些希望从其他领域...
《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...
Cocos2d-x是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...
标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...
《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...
《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...