cocos2d-x中封装CCMenuItem等相关按钮,但是有些时候需要自己封装按钮,这样能够更加灵活的实现对应功能。

自定义Button,需要重写OnEnter()和onExit()函数,并在对应函数中添加注册和取消注册。

BaseButton.h内容

  1. #ifndef BaseButton_H_H
  2. #define BaseButton_H_H
  3.  
  4. #include "cocos2d.h"
  5. using namespace cocos2d;
  6.  
  7. typedef SEL_CallFunc v_callback;
  8.  
  9. class BaseButton : public CCNodeRGBA, public CCTargetedTouchDelegate
  10. {
  11. public:
  12. BaseButton() : sprite1(NULL), sprite2(NULL), curSprite(NULL), downCallback(NULL), moveCallback(NULL), upCallback(NULL) {}
  13. static BaseButton* create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0);
  14. virtual bool initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0);
  15.  
  16. virtual void onEnter();
  17. virtual void onExit();
  18.  
  19. virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
  20. virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
  21. virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
  22. //virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
  23.  
  24. void downHand();
  25.  
  26. virtual void update();
  27.  
  28. private:
  29. CCSprite *sprite1, *sprite2, *curSprite;
  30. //vCallback downCallback, moveCallback, upCallback;
  31. //void (*downCallback)(void);
  32. void (*moveCallback)(void);
  33. //void (*upCallback)(void);
  34. v_callback downCallback;
  35. v_callback upCallback;
  36. };
  37.  
  38. #endif

BaseButton.cpp内容

  1. #include "BaseButton.h"
  2.  
  3. BaseButton* BaseButton::create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
  4. {
  5. BaseButton *button = new BaseButton();
  6. if(button && button->initWithFile(pszFileName1, pszFileName2, upCallback0)){
  7. button->autorelease();
  8. return button;
  9. }
  10. CC_SAFE_DELETE(button);
  11. return NULL;
  12. }
  13.  
  14. bool BaseButton::initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
  15. {
  16. if( !CCNodeRGBA::init() ){
  17. return false;
  18. }
  19. if(pszFileName1 == NULL){
  20. return false;
  21. }
  22.  
  23. sprite1 = CCSprite::create( pszFileName1 );
  24. CCSize size = sprite1->getContentSize();
  25. if(pszFileName2 != NULL){
  26. sprite2 = CCSprite::create( pszFileName2 );
  27. }
  28. else{
  29. sprite2 = CCSprite::create( pszFileName1 );
  30. sprite2->setColor( ccc3(, , ) );
  31. sprite2->setOpacity( (GLubyte)(*0.7) );
  32. }
  33. sprite2->setVisible(false);
  34. sprite2->setScaleX(size.width/sprite2->getContentSize().width);
  35. sprite2->setScaleY(size.height/sprite2->getContentSize().height);
  36. addChild(sprite1);
  37. addChild(sprite2);
  38. curSprite = sprite1;
  39.  
  40. downCallback = (SEL_CallFunc)(&BaseButton::downHand);
  41. upCallback = upCallback0;
  42.  
  43. scheduleUpdate();
  44.  
  45. return true;
  46. }
  47.  
  48. void BaseButton::onEnter()
  49. {
  50. CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, , true);
  51. }
  52.  
  53. void BaseButton::onExit()
  54. {
  55. CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  56. }
  57.  
  58. bool BaseButton::ccTouchBegan(CCTouch* pTouch, CCEvent *pEvent)
  59. {
  60. //CCPoint point = pTouch->getLocation();
  61. CCPoint point = this->convertTouchToNodeSpaceAR(pTouch);
  62. if( sprite1->boundingBox().containsPoint(point) ){
  63. if(downCallback != NULL){
  64. (this->*downCallback)();
  65. }
  66. return true;
  67. }
  68. return false;
  69. }
  70.  
  71. void BaseButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
  72. {
  73. if(moveCallback != NULL){
  74. moveCallback();
  75. }
  76. }
  77.  
  78. void BaseButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
  79. {
  80. sprite2->setVisible(false);
  81. sprite1->setVisible(true);
  82. if(upCallback != NULL){
  83. //upCallback();
  84. (this->*upCallback)();
  85. }
  86. //CCMessageBox("Up", "Info");
  87. }
  88.  
  89. void BaseButton::downHand()
  90. {
  91. sprite1->setVisible(false);
  92. sprite2->setVisible(true);
  93. }
  94.  
  95. void BaseButton::update()
  96. {
  97.  
  98. }

MyScene.h内容

  1. #ifndef MyScene_H_H
  2. #define MyScene_H_H
  3.  
  4. #include "cocos2d.h"
  5. using namespace cocos2d;
  6.  
  7. class MyScene : public CCLayer
  8. {
  9. public:
  10. static CCScene* createScene();
  11. virtual bool init();
  12. CREATE_FUNC( MyScene );
  13.  
  14. void upCallback();
  15.  
  16. private:
  17. };
  18.  
  19. #endif

MyScene.cpp内容

  1. #include "MyScene.h"
  2. #include "BaseButton.h"
  3.  
  4. CCScene* MyScene::createScene()
  5. {
  6. CCScene *scene = CCScene::create();
  7. MyScene *layer = MyScene::create();
  8. scene->addChild(layer);
  9. return scene;
  10. };
  11.  
  12. bool MyScene::init()
  13. {
  14. if( !CCLayer::init() ){
  15. return false;
  16. }
  17.  
  18. CCSize size = CCDirector::sharedDirector()->getWinSize();
  19.  
  20. BaseButton *button = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback1) );
  21. button->setAnchorPoint(ccp(0.5, 0.5));
  22. button->setPosition(, size.height/);
  23. button->setScale(0.25f);
  24. addChild(button);
  25.  
  26. BaseButton *button2 = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback2) );
  27. button2->setAnchorPoint(ccp(0.5, 0.5));
  28. button2->setPosition(, size.height/);
  29. button2->setScale(0.25f);
  30. addChild(button2);
  31.  
  32. return true;
  33. }
  34.  
  35. void MyScene::upCallback1()
  36. {
  37. CCMessageBox("Up1", "Info");
  38. }
  39.  
  40. void MyScene::upCallback2()
  41. {
  42. CCMessageBox("Up2", "Info");
  43. }

运行结果:

这里的button响应函数使用的是成员函数指针,需要通过对象进行使用,如(this->*upCallback)()。

而普通的函数指针则需要是static函数,成员函数则会出现错误。

cocos2d-x学习记录6——自定义Button的更多相关文章

  1. jQuery Moblile Demos学习记录Theming、Button、Icons图标,脑子真的不好使。

    jQuery Moblile Demos学习记录Theming.Button.Icons图标,脑子真的不好使. 06. 二 / Jquery Mobile 前端 / 没有评论   本文来源于www.i ...

  2. Yii2的相关学习记录,自定义gii模板和引用vendor中的js、css(四)

    上文中后台模板框架已经搭建起来了,但还是有些不协调,像是有两个User标题,或者我们想自己在gii生成时添加或删除些公用的东西.这就需要我们定义自己的gii模板. 我们以CRUD的模板为例,默认的gi ...

  3. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

  7. UWP学习记录3-设计和UI之样式

    UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...

  8. UWP学习记录2-设计和UI之布局

    UWP学习记录2-设计和UI之布局 1.导航基础知识 应用里,多个页面会有层次关系或者对等关系.这两种关系,通常在一个复杂应用里都会存在,而关系的选定依据: 对于对等导航,一般用选项卡(tabs)或者 ...

  9. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

随机推荐

  1. Python数据类型之list和tuple

    list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...

  2. Oracle EBS AR 贷项通知单核销取值

    SELECT cm.trx_number ,fnd_flex_ext.get_segs('SQLGL', 'GL#', gcc.chart_of_accounts_id, ad.code_combin ...

  3. 将目录结构输出为json格式(zTree)

    # -*- coding: UTF-8 -*- import json,os path = 'E:\\BACKUP' #返回空目录 def path_to_dict(path): d = {'name ...

  4. xml 注意事项

      <?xml version="1.0" encoding="GB2312"?> xml区分大小写,只能有一个根元素,属性值必须放在引号中,空格不 ...

  5. 【C语言】 8421BCD码与二进制的转换

    #define BCD2TODEC(bcd) (bcd) = ((bcd) & 0x0f)+ ((bcd)>>4)*10 #define BIN2BCD(bcd) (bcd) = ...

  6. 设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”,则抛出一个异常信息“This is a XYZ”,如果从命令行输入 ABC,则没有抛出异常.(只有 ...

  7. 数值分析 最小二乘 matlab

    1. 已知函数在下列各点的值为   -1 -0.75 -0.5 0 0.25 0.5 0.75   1.00 0.8125 0.75 1.00 1.3125 1.75 2.3125 分别用一次.二次. ...

  8. 2018.09.01 09:22 Exodus

    Be careful when writing in the blog garden. Sometimes you accidentally write something wrong, and yo ...

  9. PyQt5--QCheckBox

    1 # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys ...

  10. ES6中变量解构的用途—遍历Map结构