cocos2d-js 自定义监听 EventCustom
发布时间:2020-12-14 17:04:25 所属栏目:百科 来源:网络整理
导读:cf.TestScene = cc.Scene.extend({ _listener1:null});cf.TestScene.create = function () { var res = new cf.TestScene(); if(res res.init()) { return res; } res = null; return null;}cf.TestScene.prototype.init = function () { if(cc.Scene.protot
cf.TestScene = cc.Scene.extend({ _listener1:null }); cf.TestScene.create = function () { var res = new cf.TestScene(); if(res && res.init()) { return res; } res = null; return null; } cf.TestScene.prototype.init = function () { if(cc.Scene.prototype.init.call(this)) { // 创建自定义监听器 var that = this; if(!this.listener1) { this.listener1 = cc.EventListener.create({ event: cc.EventListener.CUSTOM,eventName: "game_custom_event1",callback: function(event){ that.testCallback(event.getUserData()); } }); cc.eventManager.addListener(this.listener1,1); } // 定义了一个 EventCustom ,并且设置了其 UserData 数据,手动的通过 cc.eventManager.dispatchEvent(event); 将此事件分发出去,从而触发之前所实现的逻辑。 var event = new cc.EventCustom("game_custom_event1"); event.setUserData("message"); cc.eventManager.dispatchEvent(event); return true; } return false; } cf.TestScene.prototype.onExit = function () { cc.Scene.prototype.onExit.call(this); if(this._listener1) { cc.eventManager.removeListener(this._listener1); this._listener1 = null; } } cf.TestScene.prototype.testCallback = function (data) { cc.log("it was in test Callback,data==>" + data); }
参考:http://www.cocoachina.com/bbs/read.php?tid=225198 cocos2d-js v3.0 新功能-----事件分发机制
事件分发机制
简介 在使用时,首先创建一个事件监听器,事件监听器包含以下几种:
使用方法 现在将要实现在一个界面中添加三个按钮,三个按钮将会互相遮挡,并且能够触发触摸事件,以下是具体实现 首先创建三个精灵,作为三个按钮的显示图片
创建一个单点触摸事件监听器,并完成逻辑处理内容
cc.EventListener.create 是一个创建事件监听器的总接口,你可以使用 event 来设置创建的监听器类型, 如上例中的cc.EventListener.TOUCH_ONE_BY_ONE 为单次触摸事件监听器。 Event类型列表:
cc.eventManager 是单例对象,可直接拿来使用,通过它管理所有事件分发情况。通过 addListener 函数可以将listener加入到管理器中,需要注意的是第二个参数,如果传入的是一个Node对象,则加入的是SceneGraphPriority(精灵以显示优先级) 类型的listener,如果是一个数值类型的参数,则入到的是FixedPriority 类型的listener。 注意: 这里当我们再次使用 listener1 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addListener 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority 类型的 listener添加完之后需要手动remove,而SceneGraphPriority 类型的 listener是跟node绑定的,在node调用cleanup时会被移除。具体的示例用法可以参考引擎自带的tests。 更快速的添加事件监听器到管理器的方式
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!"); }, onKeyReleased: function(keyCode,event){ var label = event.getCurrentTarget(); label.setString("Key " + keyCode.toString() + " was released!"); } },statusLabel); 加速计事件 在使用加速计事件监听器之前,需要先启用此硬件设备: cc.inputManager.setAccelerometerEnabled(true); 然后将相应的事件处理监听器与sprite进行绑定就可以了,如下:
鼠标响应事件 在 3.0 中多了鼠标捕获事件派发,这可以在不同的平台上,丰富我们游戏的用户体验。
自定义事件 以上是系统自带的事件类型,这些事件由系统内部自动触发,如 触摸屏幕,键盘响应等,除此之外,还提供了一种 自定义事件,简而言之,它不是由系统自动触发,而是人为的干涉,如下:
以上定义了一个 “自定义事件监听器”,实现了一些逻辑,并且添加到事件分发器。那么以上逻辑是在什么情况下响应呢?请看如下:
定义了一个 EventCustom ,并且设置了其 UserData 数据,手动的通过 cc.eventManager.dispatchEvent(event); 将此事件分发出去,从而触发之前所实现的逻辑。 移除事件监听器 我们可以通过以下方法移除一个已经被添加了的监听器。
也可以使用如下方法,移除注册到cc.eventManager中以一种类型注册的所有监听器,也可以用这个方法移除注册到cc.eventManager以同一node对象注册的所有监听器。
还可以使用如下方法,移除cc.eventManager中所有监听器。
当使用 removeAll 的时候,此节点的所有的监听将被移除,推荐使用 指定删除的方式。 _注意:_removeAll 之后 菜单 也不能响应。因为它也需要接受触摸事件。 暂停/恢复 cc.Node(SceneGraph类型)的监听器 开发过程中,我们经常会遇到这样的情况:想要让一个Layer中所有的Node对象的事件都停止响应。 在响应用户事件后,又要恢复该Layer的所有事件响应。如: 用户想要显示一个模式对话框,显示对话框后,禁止对话框后所有对象的事件响应。 在用户关闭对话框后,又恢复这些对象的事件响应。 我们只需要暂停根node的事件,就可以让根节点以及其子节点暂停事件响应。 代码如下:
而恢复对象的事件响应也非常简单:
注意: 第二个参数为可选参数,默认值为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 可选参数:
创建EventListenerTouchAllAtOnce对象: event: cc.EventListener.TOUCH_ALL_AT_ONCE 可选参数:
创建EventListenerKeyboard对象: event: cc.EventListener.KEYBOARD 可选参数:
创建EventListenerMouse对象: event: cc.EventListener.MOUSE 可选参数:
创建EventListenerAcceleration对象: event: cc.EventListener.ACCELERATION 可选参数:
创建EventListenerCustom对象: event: cc.EventListener.CUSTOM 可选参数:
cc.eventManager (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |