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相关推荐

  1. cocos2d-x 3.10 PageView BUG

    cocos2d-x 3.10 PageView 拖动滚动到下一个单元,没事件,3.11有修复. 转载于:https://www.cnblogs.com/qianwang/p/6106324.html

  2. cocos2d-x 音效中断问题

    做跑酷重吃金币播音效时,播放其它音效会使得音效所有中断,最后发现时音效上限的问题,2.2.3默认的似乎是5个音效,改动成50后问题解决. 在java中的org.cocos2dx.lib包下有一个Coc ...

  3. [转]cocos2d-x

    Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...

  4. 怎样用cocos2d-x做一个基于地图块的游戏(Part One)

    怎样用cocos2d-X做一个基于地图块的游戏 (Part One) 在这个分为上下两部分的教程中,我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏.在这个简单的地图块游戏里,一 ...

  5. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题

    笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...

  6. 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上

    作者:方格子 链接:https://www.zhihu.com/question/21505500/answer/22152464 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)

    [注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 上一篇 点此阅读 简要介绍了FlashToAnimation的功能,也就是将flash动画无缝导入到Android ...

  8. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(一)

    [注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 项目介绍 项目名称:FlashAnimationToMobile 源码. 使用方法点这里. 这是一个把flash中 ...

  9. 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数

    Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: [iOS-cocos2d-X 游戏开发之十三]详细讲解在 ...

最新文章

  1. java数据集成是什么_数据集成 - BlueDavy之技术Blog - BlogJava
  2. Python+Opencv实现模板匹配
  3. 什么是 TCC分布式事务
  4. Linux mmap
  5. 【模板】最新空web.xml模板
  6. matlab约当消去法,Gauss消去法解线性方程组(Matlab)
  7. 操作系统——实验叁——主存空间的分配与回收
  8. 河南科技大学计算机信息安全技术考试,关于申报2020年信息安全等级保护项目的通知...
  9. HttpURLConnection的使用步骤
  10. tensorflow函数介绍(3)
  11. hl3150cdn废粉仓清零_常见施乐联想兄弟等打印机加粉清零(废粉仓清零)方法
  12. socket程序退出后端口依然被占用问题的解决
  13. 操作系统笔记-信号量机制
  14. 全国计算机等级考试三级Linux应用与开发技术考试-习题汇总
  15. 给俺的女神翠花发邮件告白,我学会了这些网络基础知识
  16. %02x与%2x 区别
  17. 旺旺qq html,如何在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
  18. 作业一 统计软件简介与数据操作
  19. dmp标签_[重磅推荐]你必须知道的京准通DMP知识!
  20. 收藏的书录,值得花时间去读的书

热门文章

  1. html 文章阅读次数,关于浏览次数和浏览次数缓存的问题
  2. 18春《c语言》在线作业3,华师18春《C语言程序设计A》在线作业参考
  3. visio网络拓扑图 下载_Visio2019软件下载及安装教程
  4. 如何处理不能复现的bug?软件测试工程师避坑指南
  5. 【入门篇】接口自动化测试
  6. python的前世今生
  7. oracle 导出写入文件失败怎么办,编辑dmp文件解决导入导出问题(oracle 922错误 ,缺少或无效选项)...
  8. 黑马博客——详细步骤(九)项目功能的实现之mongoDB数据库添加账号
  9. 剑指offer面试题[17]-合并两个排序的链表
  10. 我在美团的八年,技术人必读