对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类。

自定义Touch事件处理类重要的步骤是:

1. 继承CCTargetedTouchDelegate

2. 添加addTargetedDelegate(pDelegate, nPriority, bSwallowsTouches),来获取Touch事件,第二个参数是优先级,越高越优先。

3. 根据自己的需要override Touch事件处理函数:

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

如下是实例:这里添加一个自定义的Button到场景层。

  1. #include <cocos2d.h>
  2. USING_NS_CC;
  3. class MyButton : public CCNode, public CCTargetedTouchDelegate
  4. {
  5. public:
  6. MyButton(void);
  7. ~MyButton(void);
  8. virtual void onEnter();
  9. virtual void onExit();
  10. virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
  11. virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
  12. virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
  13. virtual bool init();
  14. CREATE_FUNC(MyButton);
  15. private:
  16. CCSprite *m_ShowPic;
  17. };
  1. #include "MyButton.h"
  2. MyButton::MyButton(void):m_ShowPic(NULL)
  3. {
  4. }
  5. MyButton::~MyButton(void)
  6. {
  7. }
  8. bool MyButton::init()
  9. {
  10. bool bRet = false;
  11. do
  12. {
  13. CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  14. m_ShowPic = CCSprite::create("share.png");
  15. m_ShowPic->setPosition(ccp(winSize.width/2, winSize.height/2));
  16. this->addChild(m_ShowPic);
  17. bRet = true;
  18. } while(0);
  19. return bRet;
  20. }
  21. void MyButton::onEnter()
  22. {
  23. CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
  24. CCNode::onEnter();
  25. }
  26. void MyButton::onExit()
  27. {
  28. CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  29. CCNode::onExit();
  30. }
  31. bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
  32. {
  33. CCLog("MyButton Touch Began!");
  34. return true;
  35. }
  36. void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
  37. {
  38. CCLog("MyButton Touch Move!");
  39. }
  40. void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
  41. {
  42. CCLog("MyButton Touch Ended!");
  43. }

将以下代码其添加到HelloWorldScene::init中,

  1. ////////////////////////////
  2. // Add MyButton
  3. MyButton *button = MyButton::create();
  4. this->addChild(button, 10);
  5. button->setPosition(CCPointZero);

运行测试:


在屏幕中点击可以看到Output中显示了我们的CCLog提示

可是我们没有点击到图片时也会提示出CCLog,这并不是我们想要的。

那么我们就需要添加自己需要的Touch事件处理代码了:

例如如下:

    1. bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
    2. {
    3. CCPoint position = convertTouchToNodeSpaceAR(touch);
    4. if (!m_ShowPic->boundingBox().containsPoint(position))
    5. return false;
    6. CCLog("MyButton Touch Began!");
    7. // add your code...
    8. return true;
    9. }
    10. void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
    11. {
    12. CCLog("MyButton Touch Move!");
    13. // add your code...
    14. }
    15. void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
    16. {
    17. CCLog("MyButton Touch Ended!");
    18. // add your code...
    19. }

自定义CCNode的更多相关文章

  1. [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)

    节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下:     ...

  2. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用

    步骤一:首先自定义类(这里Himi自定义类名 “MySprite”) MySprite.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // //  ...

  3. Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类

    原创:请注明转载! 在Cocos2d-x中使用CocosBuilder 使用自定义类 CocosBuilder的使用方法是通过自定义类.在CocosBuilder中选中一个对象并在属性栏中输入自定义类 ...

  4. Cocos2D-x权威指南:核心类成员CCNode

    节点类(CCNode)是Cocos2D-x中的主要类,继承自CCObject.继承关系如图3-2所看到的. 不论什么须要画在屏幕上的对象都是节点类. 最经常使用的节点类包含场景类(CCScene).布 ...

  5. cocos2dx进阶学习之CCNode

    继承关系 CCNode  -> CCObject CCNode在cocos2dx中抽象舞台对象,需要渲染的对象都是从CCNode派生,包括CCScene,CCLayer,CCSprite等等 C ...

  6. 使用CCNode作为容器容易踩的坑

    Cocos2dx中CCNode经常作为一个父容器,里面装一些UI控件,最后组成一个复杂的自定义的UI控件,但是在使用别人的自定义控件和自己写自定义问题的时候会踩一些坑. 首先拿到一个自定义的UI控件一 ...

  7. 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类

    此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...

  8. 关于Unity3D自定义编辑器的学习

    被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做).  刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...

  9. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

随机推荐

  1. Java程序流程控制:判断结构、选择结构、循环结构

    本文内容: 判断结构 if 选择结构 switch 循环结构 while do-while for for each break.continue return 首发时间:2017-06-22 21: ...

  2. EVE Online Third Party Development

    第一部分:price_history表 # 建表语句 CREATE TABLE IF NOT EXISTS `price_history` ( `regionID` INT NOT NULL, `ty ...

  3. SQLSERVER中的鬼影索引

    SQLSERVER中的鬼影索引 看这篇文章之前可以先看一下鬼影记录 了解了解一下SQLSERVER里的鬼影记录关于鬼影记录的翻译一关于鬼影记录的翻译二 当删除表中的某一条记录的时候,索引页面的对应记录 ...

  4. 【SPL标准库专题(1)】 SPL简介

    什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...

  5. windows7环境下使用pip安装MySQLdb for python3.7

    1.首先,需要确定你已经安装了pip.在Python2.7的安装包中,easy_install.py和pip都是默认安装的.可以在Python的安装目录先确认,如果\Python37\Scripts里 ...

  6. oracle中insert 多条数据方法

    oracle中的insert 和 mysql添加多条数据的 方式不太一样 用到的语法: insert all into 表名(需要添加的表字段)values(添加的字段数据一定要对应字段顺序) int ...

  7. crm lookup

    1. 大家都知道CRM 里面的Lookup 保存了相关实体的GUID,让我们深入的了解一下CRM Lookup.当我们在2个实体间建立关系的时候,CRM自动生成了一些attributes来保存相关实体 ...

  8. etc/skel目录介绍

    /etc/skel目录的作用: /etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户家目录下,默认情况下,/etc/skel 目录下 ...

  9. Docker 使用入门,创建一个Nginx服务器

    运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 dock ...

  10. arcgis pro2.3教程与问题集持续更新(一)

    Arcgis pro 2.3是64位的不支持mdb 数据库,因为微软没有开放Access64的接口,所以不能支持个人地理数据库.mdb(Microsoft Database). arcgis pro ...