创建一个单点触摸事件监听器(事件类型: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