在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);













cocos2dx 3.0 触摸机制的更多相关文章

  1. [cocos2d-x 3.0] 触摸显示器

    一.基本使用 1.首先,声明一个监听器 有两种,EventListenerTouchOneByOne 和 EventListenerTouchAllAtOnce,前者是单点触控.后者是多点触控.后者我 ...

  2. cocos2dx 3.2 事件机制

    一个sprite的情况 // oneSprite void HelloWorld::touchableSpriteTestOne() { Vec2 origin = Director::getInst ...

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

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

  4. cocos2d-x 源代码分析 : EventDispatcher、EventListener、Event 源代码分析 (新触摸机制,新的NotificationCenter机制)

    源代码版本号来自3.x,转载请注明 cocos2d-x 源代码分析总文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结 ...

  5. cocos2d-x 3.0 事件分发机制

    在cocos2d-x 3.0中一共有五个事件监听器: 触摸事件(EventListenerTouch) 键盘响应事件 (EventListenerKeyboard) 加速器记录事件(EventList ...

  6. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

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

  7. cocos2d-x 3.0 内存管理机制

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

  8. Cocos2d-x 3.0 事件系统【转】

    事件系统,是一个软件的核心组成部分.从小处讲它是应用程序内部各模块交互的设计模式,从大处讲,它是软件架构的组成模块.在现代软件开发中,操作系统通常通过一些预定义的事件,告知应用程序发生的一些事情如用户 ...

  9. Cocos2dx 3.0 交流篇

    创建项目: For(MAC) Runtime Requirements Android 2.3 or newer iOS 5.0 or newer OS X 10.7 or newer Windows ...

随机推荐

  1. 数学语言和程序语言的对比:面向过程与面向集合&命题

    共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...

  2. win7/8下VirtualBox虚拟共享文件夹设置

    1. 安装增强功能包(VBoxGuestAdditions)   打开虚拟机,运行ubuntu,在菜单栏选择"设备->安装增强功能",根据提示即可安装成功(成功后也可 以实现 ...

  3. Top Android App使用的组件 3

    8684公交 AdChina:com.adchina:易传媒广告平台 AdsMogo:com.adsmogo:芒果移动广告平台 大姨吗 AChartEngine:org.achartengine:An ...

  4. 解决32位plsql客户端连接不64位Oracle11g上数据库

    一.解决方案 因为本人安装的是64位的Oracle,plsql 是32位的故连接不上.网上有方法能连接. 1. 文件下载 下载PLSQL_Developer地址 http://pan.baidu.co ...

  5. IOS Swizzle(hook)

    /////////////////////////////////////////////////////////////////////////////////////////////////// ...

  6. CSS基础知识——选择器

    选择器 元素选择器# 文档元素为最基本的选择器 例子:div{属性:值}; 选择器分组 例子:h2,p{属性:值}; 表示符合这两种规则的元素设置相同的属性值 通配选择器 表示所有元素 类选择器 应用 ...

  7. Hibernate逆向工程

    MySQL Administrator 创建表   MyEclipse Database Explorer视图: 1. New  2 .Driver template: MySQL Connector ...

  8. JAVA虚拟机之类加载器

    转载请声明:原文转自http://www.cnblogs.com/xiezie/p/5909570.html 1.JVM的生命周期 1.1 JVM的生命周期和程序的生命周期一致 1.2 JVM结束生命 ...

  9. Android滑动动画ViewFlipper和视频播放VideoView的使用

    Android滑动动画,可以用ViewPager或者ViewFlipper实现. ViewPager自带触摸滑动功能,结合Fragment使用很好,来自补充组件android-support-v4.j ...

  10. 15个顶级Java多线程面试题及答案

    1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...