在cocos2dx 3.0版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码

/* Callback function should not be deprecated, it will generate lots of warnings.Since 'setTouchEnabled' was deprecated, it will make warnings if developer overrides onTouchXXX and invokes setTouchEnabled(true) instead of using EventDispatcher::addEventListenerWithXXX.*///单点触摸virtual bool onTouchBegan(Touch *touch, Event *unused_event); virtual void onTouchMoved(Touch *touch, Event *unused_event); virtual void onTouchEnded(Touch *touch, Event *unused_event); virtual void onTouchCancelled(Touch *touch, Event *unused_event);//多点触摸virtual void onTouchesBegan(const std::vector<touch*>& touches, Event *unused_event);virtual void onTouchesMoved(const std::vector<touch*>& touches, Event *unused_event);virtual void onTouchesEnded(const std::vector<touch*>& touches, Event *unused_event);virtual void onTouchesCancelled(const std::vector<touch*>&touches, Event *unused_event);

单点触摸:(即只有注册的Layer才能接收触摸事件)

onTouchBegan:如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递

如果返回false,本层的后续Touch事件不能被触发,并向后传递

简单点来说,如果

1.Layer 只有一层的情况:

virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent); a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息2.Layer 有多层的情况:virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent); a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息

单点触摸简单用法:

在Layer中添加如下代码,重写onTouchxxx函数

        auto dispatcher = Director::getInstance()->getEventDispatcher();auto listener = EventListenerTouchOneByOne::create();listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,this);listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved,this);listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded,this);listener->setSwallowTouches(true);//不向下传递触摸dispatcher->addEventListenerWithSceneGraphPriority(listener,this);

listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响

listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B

多点触摸点单用法(多个Layer获取屏幕事件):

        auto dispatcher = Director::getInstance()->getEventDispatcher();auto listener1 = EventListenerTouchAllAtOnce::create();listener1->onTouchesBegan = CC_CALLBACK_2(GameLayer::onTouchesBegan,this);listener1->onTouchesMoved = CC_CALLBACK_2(GameLayer::onTouchesMoved,this);listener1->onTouchesEnded = CC_CALLBACK_2(GameLayer::onTouchesEnded,this);dispatcher->addEventListenerWithSceneGraphPriority(listener1,this);

或者setTouchEnabled(true),然后重写layer的onTouchsxxx函数

关于eventDispatcher:

  • 获取方法:

  • auto dispatcher = Director::getInstance()->getEventDispatcher();

    事件监听器包含以下几种:

    • 触摸事件 (EventListenerTouch)
    • 键盘响应事件 (EventListenerKeyboard)
    • 加速记录事件 (EventListenerAcceleration)
    • 鼠标响应事件 (EventListenerMouse)
    • 自定义事件 (EventListenerCustom)

      以上事件监听器统一由 _eventDispatcher 来进行管理。

      优先权:1.优先级越低,越先响应事件2.如果优先级相同,则上层的(z轴)先接收触摸事件有两种方式将 事件监听器 listener1 添加到 事件调度器_eventDispatcher 中:

      void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)

      代码展开一下:

      void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
      {CCASSERT(listener && node, "Invalid parameters.");CCASSERT(!listener->isRegistered(), "The listener has been registered.");if (!listener->checkAvailable())return;listener->setSceneGraphPriority(node);listener->setFixedPriority(0);listener->setRegistered(true);addEventListener(listener);
      }
      void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)
      {CCASSERT(listener, "Invalid parameters.");CCASSERT(!listener->isRegistered(), "The listener has been registered.");CCASSERT(fixedPriority != 0, "0 priority is forbidden for fixed priority since it's used for scene graph based priority.");if (!listener->checkAvailable())return;listener->setSceneGraphPriority(nullptr);listener->setFixedPriority(fixedPriority);listener->setRegistered(true);listener->setPaused(false);addEventListener(listener);
      }

      (1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。 (2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。
      移除方法:

      dispatcher->removeEventListener(listener);

转载于:https://www.cnblogs.com/sealme/p/3844405.html

cocos2dx 3.0 触摸机制相关推荐

  1. Cocos2d-x 3.0 屏幕触摸及消息分发机制

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  2. cocos2d-x 3.0学习游戏笔记的例子《卡塔防》第五步---开始建立游戏界面

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码.第二能够说 ...

  3. 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)

    游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...

  4. CocoaChina大会见闻——cocos2d-x 3.0 新特性

    1.目的 参加了CocoaChina大会,感觉内容还是挺多的,具体会议细节大家可以去CocoaChina上看,上面应该有会议记录.写这篇博客主要是整理一下思路,以及面对3.0接下来需要了解的东西.也希 ...

  5. Cocos中的触摸机制总结(附相关C++11基础)

    Cocos2d-x学习之路(个人总结) http://www.docin.com/p-1489599279.html 四.触摸篇 1.传统的单点触摸(针对scene的触屏事件) 1.1单点触摸的声明 ...

  6. 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  7. 18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

    重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件 ...

  8. 如何制作一个基于Tile的游戏 Cocos2d-x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  9. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

最新文章

  1. python tkinter画笑脸_Python3 Tkinter基础 Canvas create_line 画实线与虚线
  2. 牛顿第三定律不再起作用:芝加哥大学找到了一种新系统,作用力不等于反作用力...
  3. Jquery的html方法里包含特殊字符的处理,类似双引号之类的
  4. go使用PostgreSQL数据库
  5. 编程之美2.13子数组的最大乘积
  6. 4位并行加载寄存器设计
  7. 领域应用 | 用知识图谱玩唐诗,“唐诗别苑”附庸端午节的别样风雅!
  8. 零基础入门NLP - 新闻文本分类,正式赛第一名方案分享
  9. python中tf.abs_python – Tensorflow:替换tf.nn.rnn_cell._linear(输入,大小,0,范围)
  10. C中的volatile用法
  11. iOS企业证书申请介绍
  12. [Python] Python 之 __new__() 方法与实例化
  13. 加密-网络安全之1号皇帝新衣
  14. php立方体相册源码,制作三维电子相册 3d立方体相册制作(flash相册制作)
  15. Postgresql源码(33)Btree索引读——整体流程_bt_first
  16. 尾气冒黑烟是什么问题_尾气冒黑烟是坏了?教你通过尾气辨别爱车是否故障!...
  17. 《联众》并购案细节公布,海虹海外公司浮出水面(ZT)
  18. 【Unity基础知识之一】 Unity支持 IOS 64-BIT
  19. 10 个不错 Web3 设计灵感网站
  20. robot光线机器人安卓版_RobotMake下载-RobotMake机器人控制软件下载v3.1.5 安卓版-西西软件下载...

热门文章

  1. django web app_妹子用半天时间开发一个员工管理系统,没错django就是这么强悍
  2. byte数组转double_java数组(不同类型的初始值)
  3. 阿里实人认证android,Android客户端接入
  4. java gc检测工具_Java自带的性能监测工具之jstat
  5. adb模拟按键home_ADB——模拟手机按键输入
  6. latex转为html效果好吗,latex2html
  7. bootstrap树节点如何设置默认不展开_我开源了一个基于Vue的组织架构树组件
  8. 数字信号处理基础总结--7.28
  9. ofdma技术_数字化领航 | Wi-Fi 6 关键技术剖析
  10. 简述中断和 DMA 的区别。