Cocos2dx 之 ButtonSprite
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 handleButtonClick_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);// optionalvirtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//update 2013-02-17void 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;
};
// optionalvoid 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()]");
}
Cocos2dx 之 ButtonSprite相关推荐
- cocos2d-x 3.10 PageView BUG
cocos2d-x 3.10 PageView 拖动滚动到下一个单元,没事件,3.11有修复. 转载于:https://www.cnblogs.com/qianwang/p/6106324.html
- cocos2d-x 音效中断问题
做跑酷重吃金币播音效时,播放其它音效会使得音效所有中断,最后发现时音效上限的问题,2.2.3默认的似乎是5个音效,改动成50后问题解决. 在java中的org.cocos2dx.lib包下有一个Coc ...
- [转]cocos2d-x
Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...
- 怎样用cocos2d-x做一个基于地图块的游戏(Part One)
怎样用cocos2d-X做一个基于地图块的游戏 (Part One) 在这个分为上下两部分的教程中,我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏.在这个简单的地图块游戏里,一 ...
- 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...
- 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上
作者:方格子 链接:https://www.zhihu.com/question/21505500/answer/22152464 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)
[注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 上一篇 点此阅读 简要介绍了FlashToAnimation的功能,也就是将flash动画无缝导入到Android ...
- Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(一)
[注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 项目介绍 项目名称:FlashAnimationToMobile 源码. 使用方法点这里. 这是一个把flash中 ...
- 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数
Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: [iOS-cocos2d-X 游戏开发之十三]详细讲解在 ...
最新文章
- java数据集成是什么_数据集成 - BlueDavy之技术Blog - BlogJava
- Python+Opencv实现模板匹配
- 什么是 TCC分布式事务
- Linux mmap
- 【模板】最新空web.xml模板
- matlab约当消去法,Gauss消去法解线性方程组(Matlab)
- 操作系统——实验叁——主存空间的分配与回收
- 河南科技大学计算机信息安全技术考试,关于申报2020年信息安全等级保护项目的通知...
- HttpURLConnection的使用步骤
- tensorflow函数介绍(3)
- hl3150cdn废粉仓清零_常见施乐联想兄弟等打印机加粉清零(废粉仓清零)方法
- socket程序退出后端口依然被占用问题的解决
- 操作系统笔记-信号量机制
- 全国计算机等级考试三级Linux应用与开发技术考试-习题汇总
- 给俺的女神翠花发邮件告白,我学会了这些网络基础知识
- %02x与%2x 区别
- 旺旺qq html,如何在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
- 作业一 统计软件简介与数据操作
- dmp标签_[重磅推荐]你必须知道的京准通DMP知识!
- 收藏的书录,值得花时间去读的书
热门文章
- html 文章阅读次数,关于浏览次数和浏览次数缓存的问题
- 18春《c语言》在线作业3,华师18春《C语言程序设计A》在线作业参考
- visio网络拓扑图 下载_Visio2019软件下载及安装教程
- 如何处理不能复现的bug?软件测试工程师避坑指南
- 【入门篇】接口自动化测试
- python的前世今生
- oracle 导出写入文件失败怎么办,编辑dmp文件解决导入导出问题(oracle 922错误 ,缺少或无效选项)...
- 黑马博客——详细步骤(九)项目功能的实现之mongoDB数据库添加账号
- 剑指offer面试题[17]-合并两个排序的链表
- 我在美团的八年,技术人必读