cocos2dx 3.2中的触摸机制

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

 //单点触摸
  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);
时间: 2024-10-12 22:12:10

cocos2dx 3.2中的触摸机制的相关文章

cocos2dx 3.x中的渲染机制

1.由2.x的渲染节点,变成添加渲染命令,可以避免重复渲染相同的节点,提高了渲染效率 2.单机游戏通常要求apk包在30M以内,没压缩1M会有1%的转换率(下载转换率),即收入会提高 3.2.x中首先调用父节点的渲染方法,如果发现子节点还有渲染,则调用子节点的渲染方法,一直遍历下去,而3.x中也是这么个流程,只是不会直接调用该渲染方法,而是会添加渲染命令,然后在更新下一帧之前,统一渲染,这样的话,就可以避免重复渲染. 4.通过bt命令可以查看Mac下的堆栈信息

Cocos2d-x 3.0 中使用单点触摸

Cocos2d-x 3.0 中使用单点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2712 在游戏中,经常会用到触摸,大部分游戏也是通过触摸控制游戏角色运动的,在Cocos2d-x 3.0中使用了新的触摸机制,Cocos2d-x 3.0中摒弃了Cocos2d-x 2.0中将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应,在Cocos2d-x 3.0中只需通过创建一个

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

源代码版本号来自3.x,转载请注明 cocos2d-x 源代码分析总文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 1.1 结构 不详吐槽太多,也不贴图了.贴图要审核好久好久好久好久. 从小到大,先来看下Event的结构. 1.Event--------EventTouch,EventCustom,EventMouse,EventKeyboard,EventFocus,EventAcceleration 当中

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

源码版本来自3.x,转载请注明 cocos2d-x 源码分析总目录 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 1.1 结构 不详吐槽太多,也不贴图了,贴图要审核好久好久好久好久. 从小到大,先来看下Event的结构. 1.Event--------EventTouch,EventCustom,EventMouse,EventKeyboard,EventFocus,EventAcceleration 其中,Eve

Cocos2d-x 3.0中实现多点触摸

Cocos2d-x 3.0中实现多点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2713 在上一篇<Cocos2d-x 3.0 中使用单点触摸>中介绍了在Cocos2d-x 3.0中实现单点触摸,但是有些游戏还会用到多点触摸,其中最典型的游戏是节奏大师,在节奏大师中会不断产生运动的音符,玩家需要不停地点击音符以获得高分,而且玩家可以多个手指头一起点,多个手指头一起点就是使用多点触摸实现的. 下面通过一个小的例子介绍如何在Cocos2d-x

Android中TouchEvent触摸事件机制

当我们的手指在Android屏幕上点击或滑动时,就会触发触摸事件TouchEvent.在App中ViewGroup和View存在多级嵌套,在最外层的是Activity,最内层的View,介于Activity与View之间的是一些ViewGroup.本文为了简化讨论,我们假设一个Activity中只有一个ViewGroup,这个ViewGroup中只有一个View.当我们用手指触摸到View的UI时,就会产生触摸事件TouchEvent,总的过程如下图所示: 首先是最外层的Activity接收到该

关于在Cocos2dx中注册触摸事件——Lua

关于在Cocos2dx中注册触摸事件,之前一直对此一知半解,这两天在看引擎的源码,趁此机会写下来... 以下纯属个人理解,如有不对欢迎指正... 在引擎的CCLayer类中声明了有四个方法: 1 virtual bool onTouchBegan(Touch *touch, Event *unused_event); 2 virtual void onTouchMoved(Touch *touch, Event *unused_event); 3 virtual void onTouchEnde

QUICK 中的触摸事件

本文转载于:http://www.cocos2d-x.org/docs/manual/framework/quick/V3/touch-events/zh Cocos2d-x 原本的触摸机制存在一些限制,在使用中需要开发者做不少额外的处理.所以 Quick-Cocos2d-x 提出了自己的一套触摸机制.本文详细介绍了这套新机制的用法. 显示层级 在 Cocos2d-x 里,整个游戏的画面是由一系列的 Scene, Node, Sprite, Layer 等对象构成的.而所有这些对象都是从 Nod

【转载】Quick 中的触摸事件

原文地址 http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/touch-events/zh.md Quick 中的触摸事件 Cocos2d-x 原本的触摸机制存在一些限制,在使用中需要开发者做不少额外的处理.所以 Quick-Cocos2d-x 提出了自己的一套触摸机制.本文详细介绍了这套新机制的用法. 显示层级 在 Cocos2d-x