cocos2d-js v3.0 新功能-----事件分发机制

cocos2d-js v3.0 新功能-----事件分发机制,第1张

概述事件分发机制 简介 在使用时,首先创建一个事件监听器,事件监听器包含以下几种: 触摸事件 (cc.EventListenerTouch) 键盘响应事件 (cc.EventListenerKeyboard) 加速记录事件 (cc.EventListenerAcceleration) 鼠标响应事件 (cc.EventListenerMouse) 自定义事件 (cc.EventListenerCusto 事件分发机制
简介
在使用时,首先创建一个事件监听器,事件监听器包含以下几种:

触摸事件 (cc.EventListenertouch) 键盘响应事件 (cc.EventListenerKeyboard) 加速记录事件 (cc.EventListeneracceleration) 鼠标响应事件 (cc.EventListenerMouse) 自定义事件 (cc.EventListenerCustom) 以上事件监听器统一由 cc.eventManager 来进行管理,它是一个单例对象。它的工作需要三部分组成:
事件管理器 cc.eventManager 事件类型 cc.Eventtouch,cc.EventKeyboard 等 事件监听器 cc.EventListenertouch,cc.EventListenerKeyboard 等 监听器实现了各种触发后的逻辑,在适当时候由 事件管理器分发事件类型,然后调用相应类型的监听器。
使用方法
现在将要实现在一个界面中添加三个按钮,三个按钮将会互相遮挡,并且能够触发触摸事件,以下是具体实现
首先创建三个精灵,作为三个按钮的显示图片
@H_403_49@ 复制代码 var sprite1 = cc.Sprite.create("Images/CyanSquare.png"); sprite1.x = size.wIDth/2 - 80; sprite1.y = size.height/2 + 80; this.addChild(sprite1,10); var sprite2 = cc.Sprite.create("Images/magentaSquare.png"); sprite2.x = size.wIDth/2; sprite2.y = size.height/2; this.addChild(sprite2,20); var sprite3 = cc.Sprite.create("Images/YellowSquare.png"); sprite3.x = 0; sprite3.y = 0; sprite2.addChild(sprite3,1);

创建一个单点触摸事件监听器,并完成逻辑处理内容
复制代码 // 创建一个事件监听器 OneByOne 为单点触摸 var Listener1 = cc.EventListener.create({ event: cc.EventListener.touch_ONE_BY_ONE, swallowtouches: true,// 设置是否吞没事件,在 ontouchBegan 方法返回 true 时吞没 ontouchBegan: function (touch,event) { //实现 ontouchBegan 事件回调函数 var target = event.getCurrentTarget();// 获取事件所绑定的 target // 获取当前点击点所在相对按钮的位置坐标 var locationInNode = target.convertToNodeSpace(touch.getLocation()); var s = target.getContentSize(); var rect = cc.rect(0,s.wIDth,s.height); if (cc.rectContainsPoint(rect,locationInNode)) { // 点击范围判断检测 cc.log("sprite began... x = " + locationInNode.x + ",y = " + locationInNode.y); target.opacity = 180; return true; } return false; },247)"> ontouchmoved: function (touch,event) { // 触摸移动时触发 // 移动当前按钮精灵的坐标位置 var target = event.getCurrentTarget(); var delta = touch.getDelta(); target.x += delta.x; target.y += delta.y; ontouchended: function (touch,event) { // 点击事件结束处理 cc.log("sprite ontouchesEnded.. "); target.setopacity(255); if (target == sprite2) {// 重新设置 ZOrder,显示的前后顺序将会改变 sprite1.setLocalZOrder(100); } else if (target == sprite1) { sprite1.setLocalZOrder(0); });
cc.EventListener.create 是一个创建事件监听器的总接口,你可以使用 event 来设置创建的监听器类型,
如上例中的cc.EventListener.touch_ONE_BY_ONE 为单次触摸事件监听器。
Event类型列表:
cc.EventListener.touch_ONE_BY_ONE cc.EventListener.touch_ALL_AT_ONCE cc.EventListener.KEYBOARD cc.EventListener.MOUSE cc.EventListener.acceleration cc.EventListener.CUSTOM 添加事件监听器到事件管理器
复制代码 // 添加监听器到管理器 cc.eventManager.addListener(Listener1,sprite1); cc.eventManager.addListener(Listener1.clone(),sprite2);
cc.eventManager 是单例对象,可直接拿来使用,通过它管理所有事件分发情况。通过 addListener 函数可以将Listener加入到管理器中,需要注意的是第二个参数,如果传入的是一个Node对象,则加入的是SceneGraPHPriority(精灵以显示优先级) 类型的Listener,如果是一个数值类型的参数,则入到的是FixedPriority 类型的Listener。
注意: 这里当我们再次使用 Listener1 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addListener 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority 类型的 Listener添加完之后需要手动remove,而SceneGraPHPriority 类型的 Listener是跟node绑定的,在node调用cleanup时会被移除。具体的示例用法可以参考引擎自带的tests。
更快速的添加事件监听器到管理器的方式
复制代码 cc.eventManager.addListener({ event: cc.EventListener.touch_ALL_AT_ONCE,247)"> ontouchesMoved: function (touches,event) { var touch = touches[0]; var node = event.getCurrentTarget().getChildByTag(TAG_TILE_MAP); var diff = cc.pAdd(delta,node.getposition()); node.setposition(diff);
cc.eventManager的 addListener 的第一个参数也支持两种参数, cc.EventListener 类型和Json格式的对象,如果是Json格式对象,方法会根据event来创建相关的监听器。
新的触摸机制
以上的步骤看似相对 2.x 版本触摸机制实现时,复杂了点,在老的版本中继承一个 delegate ,里面定义了 ontouchBegan 等方法,然后在里面判断点击的元素,进行逻辑处理。而这里将事件处理逻辑独立出来,封装到一个 Listener 中,而以上的逻辑实现了以下功能:
通过添加事件监听器,将精灵以显示优先级 (SceneGraPHPriority) 添加到事件分发器。这就是说,当我们点击精灵按钮时,根据屏幕显示的“遮盖”实际情况,进行有序的函数回调(即:如图中黄色按钮首先进入 ontouchBegan 逻辑处理)。
在事件逻辑处理时,根据各种条件处理触摸后的逻辑,如点击范围判断,设置被点击元素为不同的透明度,达到点击效果。
因为设置了 swallowtouches: true 并且在 ontouchBegan 中做相应的判断,以决定其返回值是 false 还是 true,用来处理触摸事件是否依据显示的顺序关系向后传递。
注意:与 SceneGraPHPriority 所不同的是 FixedPriority 将会依据手动设定的 Priority 值来决定事件相应的优先级,值越小优先级越高。
其它事件派发处理模块
除了触摸事件响应之外,还有以下模块使用了相同的处理方式。
键盘响应事件
除了键盘,还可以是终端设备的各个菜单,他们使用同一个监听器来进行处理。
//给statusLabel绑定键盘事件
cc.eventManager.addListener({
event: cc.EventListener.KEYBOARD,
onKeypressed:function(keyCode,event){
var label = event.getCurrentTarget();
label.setString("Key " + keyCode.toString() + " was pressed!");
},serif; Font-size:14px; line-height:24px">onkeyreleased: function(keyCode,serif; Font-size:14px; line-height:24px">label.setString("Key " + keyCode.toString() + " was released!");
}

加速计事件
在使用加速计事件监听器之前,需要先启用此硬件设备:
cc.@[email protected](true);
然后将相应的事件处理监听器与sprite进行绑定就可以了,如下:
复制代码 event: cc.EventListener.acceleration,247)"> callback: function(acc,event){ //这里处理逻辑
鼠标响应事件
在 3.0 中多了鼠标捕获事件派发,这可以在不同的平台上,丰富我们游戏的用户体验。
复制代码 event: cc.EventListener.MOUSE,247)"> onMouseMove: function(event){ var str = "Mouseposition X: " + event.getLocationX() + "Y:" + event.getLocationY(); // do something... onmouseup: function(event){ var str = "Mouse Up detected,Key: " + event.getbutton(); onMouseDown: function(event){ var str = "Mouse Down detected,247)"> onMouseScroll: function(event){ var str = "Mouse Scroll detected,X: " + event.getLocationX() + "Y:" + event.getLocationY(); 自定义事件
以上是系统自带的事件类型,这些事件由系统内部自动触发,如 触摸屏幕,键盘响应等,除此之外,还提供了一种 自定义事件,简而言之,它不是由系统自动触发,而是人为的干涉,如下:
复制代码 var _Listener1 = cc.EventListener.create({ event: cc.EventListener.CUSTOM,247)"> eventname: "game_custom_event1",247)"> callback: function(event){ statusLabel.setString("Custom event 1 received," + event.getUserData() + " times"); }); cc.eventManager.addListener(this._Listener1,serif; Font-size:14px; line-height:24px">以上定义了一个 “自定义事件监听器”,实现了一些逻辑,并且添加到事件分发器。那么以上逻辑是在什么情况下响应呢?请看如下:
复制代码 ++selfPointer._item1Count; var event = new cc.EventCustom("game_custom_event1"); event.setUserData(selfPointer._item1Count.toString()); cc.eventManager.dispatchEvent(event); 定义了一个 EventCustom ,并且设置了其 UserData 数据,手动的通过 cc.eventManager.dispatchEvent(event); 将此事件分发出去,从而触发之前所实现的逻辑。
移除事件监听器
我们可以通过以下方法移除一个已经被添加了的监听器。
复制代码 cc.eventManager.removeListener(Listener); //移除一个已添加的监听器
也可以使用如下方法,移除注册到cc.eventManager中以一种类型注册的所有监听器,也可以用这个方法移除注册到cc.eventManager以同一node对象注册的所有监听器。
复制代码 cc.eventManager.removeListeners(cc.EventListener.touch_ONE_BY_ONE); //移除所有touch_ONE_BY_ONE类型的监听器 cc.eventManager.removeListeners(aSprite); //移除所有与aSprite相关的监听器
还可以使用如下方法,移除cc.eventManager中所有监听器。
复制代码 cc.eventManager.removeAllListeners();
当使用 removeAll 的时候,此节点的所有的监听将被移除,推荐使用 指定删除的方式。
_注意:_removeAll 之后 菜单 也不能响应。因为它也需要接受触摸事件。
暂停/恢复 cc.Node(SceneGraph类型)的监听器
开发过程中,我们经常会遇到这样的情况:想要让一个Layer中所有的Node对象的事件都停止响应。 在响应用户事件后,又要恢复该Layer的所有事件响应。如: 用户想要显示一个模式对话框,显示对话框后,禁止对话框后所有对象的事件响应。 在用户关闭对话框后,又恢复这些对象的事件响应。
我们只需要暂停根node的事件,就可以让根节点以及其子节点暂停事件响应。 代码如下:
复制代码 cc.eventManager.pauseTarget(aLayer,true);//让aLayer对象暂停响应事件
而恢复对象的事件响应也非常简单:
复制代码 cc.eventManager.resuMetarget(aLayer,true); //让aLayer对象恢复响应事件
注意: 第二个参数为可选参数,默认值为false,表示是否递归调用子节点的暂停/恢复 *** 作.
属性与方法列表
cc.Event (事件类)

cc.EventCustom (自定义事件)
cc.EventCustom 继承自 cc.Event

cc.EventMouse (鼠标事件)
cc.EventMouse 继承自 cc.Event
cc.Eventtouch ()
cc.Eventtouch 继承自 cc.Event
cc.EventListener (事件监听器)
cc.EventListener.create 函数参数列表:
创建EventListenertouchOneByOne对象:
event: cc.EventListener.touch_ONE_BY_ONE
可选参数:
swallowtouches,boolean,是否吞下该touch点 ontouchBegan,function,touchBegan 事件回调 ontouchmoved,touchmoved 事件回调 ontouchended,touchended 事件回调 ontouchCancelled,touchCancelled 事件回调
创建EventListenertouchAllAtOnce对象:
event: cc.EventListener.touch_ALL_AT_ONCE
ontouchesBegan,touchesBegan 事件回调 ontouchesMoved,touchesMoved 事件回调 ontouchesEnded,touchesEnded 事件回调 ontouchesCancelled,touchesCancelled 事件回调
创建EventListenerKeyboard对象:
event: cc.EventListener.KEYBOARD
onKeypressed,Keypressed (键按下) 事件回调 onkeyreleased,keyrelease (键放开) 事件回调
创建EventListenerMouse对象:
event: cc.EventListener.MOUSE
onMouseDown,MouseDown 事件回调 onmouseup,MouseUp 事件回调 onMouseMove,MouseMove 事件回调 onMouseScroll,MouseScroll 事件回调
创建EventListeneracceleration对象:
event: cc.EventListener.acceleration
callback,Acclerometer 事件回调
创建EventListenerCustom对象:
event: cc.EventListener.CUSTOM
cc.eventManager
本文转载自: http://cocos2d-x.org/docs/manual/framework/html5/v3/eventManager/zh
完整文档请参考: http://cocos2d-x.org/docs/manual/framework/html5/zh 总结

以上是内存溢出为你收集整理的cocos2d-js v3.0 新功能-----事件分发机制全部内容,希望文章能够帮你解决cocos2d-js v3.0 新功能-----事件分发机制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1041986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存