cocos2dx 3.0 触摸机制
在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 触摸机制相关推荐
- Cocos2d-x 3.0 屏幕触摸及消息分发机制
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- cocos2d-x 3.0学习游戏笔记的例子《卡塔防》第五步---开始建立游戏界面
/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码.第二能够说 ...
- 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)
游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...
- CocoaChina大会见闻——cocos2d-x 3.0 新特性
1.目的 参加了CocoaChina大会,感觉内容还是挺多的,具体会议细节大家可以去CocoaChina上看,上面应该有会议记录.写这篇博客主要是整理一下思路,以及面对3.0接下来需要了解的东西.也希 ...
- Cocos中的触摸机制总结(附相关C++11基础)
Cocos2d-x学习之路(个人总结) http://www.docin.com/p-1489599279.html 四.触摸篇 1.传统的单点触摸(针对scene的触屏事件) 1.1单点触摸的声明 ...
- 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
- 18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩
重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件 ...
- 如何制作一个基于Tile的游戏 Cocos2d-x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...
最新文章
- python tkinter画笑脸_Python3 Tkinter基础 Canvas create_line 画实线与虚线
- 牛顿第三定律不再起作用:芝加哥大学找到了一种新系统,作用力不等于反作用力...
- Jquery的html方法里包含特殊字符的处理,类似双引号之类的
- go使用PostgreSQL数据库
- 编程之美2.13子数组的最大乘积
- 4位并行加载寄存器设计
- 领域应用 | 用知识图谱玩唐诗,“唐诗别苑”附庸端午节的别样风雅!
- 零基础入门NLP - 新闻文本分类,正式赛第一名方案分享
- python中tf.abs_python – Tensorflow:替换tf.nn.rnn_cell._linear(输入,大小,0,范围)
- C中的volatile用法
- iOS企业证书申请介绍
- [Python] Python 之 __new__() 方法与实例化
- 加密-网络安全之1号皇帝新衣
- php立方体相册源码,制作三维电子相册 3d立方体相册制作(flash相册制作)
- Postgresql源码(33)Btree索引读——整体流程_bt_first
- 尾气冒黑烟是什么问题_尾气冒黑烟是坏了?教你通过尾气辨别爱车是否故障!...
- 《联众》并购案细节公布,海虹海外公司浮出水面(ZT)
- 【Unity基础知识之一】 Unity支持 IOS 64-BIT
- 10 个不错 Web3 设计灵感网站
- robot光线机器人安卓版_RobotMake下载-RobotMake机器人控制软件下载v3.1.5 安卓版-西西软件下载...
热门文章
- django web app_妹子用半天时间开发一个员工管理系统,没错django就是这么强悍
- byte数组转double_java数组(不同类型的初始值)
- 阿里实人认证android,Android客户端接入
- java gc检测工具_Java自带的性能监测工具之jstat
- adb模拟按键home_ADB——模拟手机按键输入
- latex转为html效果好吗,latex2html
- bootstrap树节点如何设置默认不展开_我开源了一个基于Vue的组织架构树组件
- 数字信号处理基础总结--7.28
- ofdma技术_数字化领航 | Wi-Fi 6 关键技术剖析
- 简述中断和 DMA 的区别。