Cocos2d-js v3.1 事件分发机制

创建一个单点触摸事件监听器(事件类型:TOUCH_ONE_BY_ONE),并完成逻辑处理内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
     // 创建一个事件监听器 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, 通常是cc.Node及其子类 
  
             // 获取当前触摸点相对于按钮所在的坐标
             var  locationInNode = target.convertToNodeSpace(touch.getLocation());    
             var  s = target.getContentSize();
             var  rect = cc.rect(0, 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 ;
         },
         onTouchMoved:  function  (touch, event) {          //实现onTouchMoved事件处理回调函数, 触摸移动时触发
             // 移动当前按钮精灵的坐标位置
             var  target = event.getCurrentTarget();
             var  delta = touch.getDelta();               //获取事件数据: delta
             target.x += delta.x;
             target.y += delta.y;
         },
         onTouchEnded:  function  (touch, event) {          // 实现onTouchEnded事件处理回调函数
             var  target = event.getCurrentTarget();
             cc.log( "sprite onTouchesEnded.. " );
             target.setOpacity(255);
             if  (target == sprite2) {                    
                 sprite1.setLocalZOrder(100);             // 重新设置 ZOrder,显示的前后顺序将会改变
             else  if  (target == sprite1) {
                 sprite1.setLocalZOrder(0);
             }
         }
     });

将事件监听器添加到事件管理器中

1
2
3
4
     // 添加监听器到管理器
     cc.eventManager.addListener(listener1, sprite1);
     cc.eventManager.addListener(listener1.clone(), sprite2);
     cc.eventManager.addListener(listener1.clone(), sprite3);

注意: 这里当我们想给不同的节点使用相同的事件监听器时,需要使用 clone() 函数克隆出一个新的监听器,因为在使用 addListener 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority 类型的 listener添加完之后需要手动删除,而SceneGraphPriority 类型的 listener是跟node绑定的,在node调用cleanup时会被移除。

更快速的添加事件监听器到管理器的方式

1
2
3
4
5
6
7
8
9
10
11
     cc.eventManager.addListener({
         event: cc.EventListener.TOUCH_ALL_AT_ONCE,
         onTouchesMoved:  function  (touches, event) {
             var  touch = touches[0];
             var  delta = touch.getDelta();
  
             var  node = event.getCurrentTarget().getChildByTag(TAG_TILE_MAP);
             var  diff = cc.pAdd(delta, node.getPosition());
             node.setPosition(diff);
         }
     },  this );

其它事件派发处理模块

键盘响应事件

1
2
3
4
5
6
7
8
9
10
11
12
13
     //给statusLabel绑定键盘事件
     cc.eventManager.addListener({
         event: cc.EventListener.KEYBOARD,
         onKeyPressed:   function (keyCode, event){
             var  label = event.getCurrentTarget();
             //通过判断keyCode来确定用户按下了哪个键
             label.setString( "Key "  + keyCode.toString() +  " was pressed!" );
         },
         onKeyReleased:  function (keyCode, event){
             var  label = event.getCurrentTarget();
             label.setString( "Key "  + keyCode.toString() +  " was released!" );
         }
     }, statusLabel);

加速计事件

在使用加速计事件监听器之前,需要先启用此硬件设备, 代码如下:

1
     cc.inputManager.setAccelerometerEnabled( true );

然后将相应的事件处理监听器与sprite进行绑定就可以了,如下:

1
2
3
4
5
6
     cc.eventManager.addListener({
         event: cc.EventListener.ACCELERATION,
         callback:  function (acc, event){
                 //这里处理逻辑
         }
     }, sprite);

鼠标响应事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     cc.eventManager.addListener({
         event: cc.EventListener.MOUSE,
         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();
             // do something...
         },
         onMouseDown:  function (event){
             var  str =  "Mouse Down detected, Key: "  + event.getButton();
             // do something...
         },
         onMouseScroll:  function (event){
             var  str =  "Mouse Scroll detected, X: "  + event.getLocationX() +  "  Y:"  + event.getLocationY();
             // do something...
         }
     }, this );

自定义事件

1
2
3
4
5
6
7
8
9
10
11
12
13
     var  _listener1 = cc.EventListener.create({
         event: cc.EventListener.CUSTOM,
         eventName:  "game_custom_event1" ,
         callback:  function (event){
             // 可以通过getUserData来设置需要传输的用户自定义数据
             statusLabel.setString( "Custom event 1 received, "  + event.getUserData() +  " times" );
         }
     });    
     cc.eventManager.addListener( this ._listener1, 1);
     ++ this ._item1Count;
     var  event =  new  cc.EventCustom( "game_custom_event1" );
     event.setUserData( this ._item1Count.toString());
     cc.eventManager.dispatchEvent(event);

移除事件监听器

1
2
3
4
     cc.eventManager.removeListener(listener);            //移除一个已添加的监听器
     cc.eventManager.removeListeners(cc.EventListener.TOUCH_ONE_BY_ONE);          //移除所有单点触摸事件监听器
     cc.eventManager.removeListeners(aSprite);                                    //移除所有与aSprite相关的监听器
     cc.eventManager.removeAllListeners();                         //移除所有监听器

暂停/恢复 与场景相关(SceneGraph类型)的监听器开发过程中,我们经常会遇到这样的情况:想要让一个Layer中所有的Node对象的事件都停止响应。 在响应用户事件后,又要恢复该Layer的所有事件响应。如: 用户想要显示一个模式对话框,显示对话框后,禁止对话框后所有对象的事件响应。 在用户关闭对话框后,又恢复这些对象的事件响应。

我们只需要暂停根node的事件,就可以让根节点以及其子节点暂停事件响应,而恢复对象的事件响应也非常简单。代码如下:

1
2
     cc.eventManager.pauseTarget(aLayer,  true );                       //让aLayer对象暂停响应事件
     cc.eventManager.resumeTarget(aLayer,  true );                      //让aLayer对象恢复响应事件


源引:http://www.ipastimes.com/post/7.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值