引擎版本是3.3.1
1.希望达到的效果
大家应该玩过大掌门这样子的游戏。这种游戏当你的手指在屏幕任意位置滑动的时候,手指的落点处都会有一个樱花的特效。同时你点击游戏里的按钮,滑动框之类的都是正常的可以交互的。也就是说这个手指落点的监听是不会影响到游戏里其他UI的监听的。它就像一个第三者一样,可以监听游戏里的任何位置的触摸事件。同时不会影响这些触摸事件的传递和分发。
2.于是我写了个例子,想要实现这个功能。
sprite1上监听的是节点的触摸事件:
@ccclass('Sprite1')
export class Sprite1 extends Component {
// [1]
// dummy = '';
// [2]
// @property
// serializableDummy = 0;
start() {
this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this);
this.node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);
this.node.on(Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
}
onTouchStart() {
log('Spr1 onTouchStart');
}
onTouchMove() {
log('Spr1 onTouchMove');
}
onTouchEnd() {
log('Spr1 onTouchEnd');
}
onTouchCancel() {
log('Spr1 onTouchCancel');
}
}
sprite2上监听的是全局的触摸事件
@ccclass('Sprite2')
export class Sprite2 extends Component {
start() {
systemEvent.on(SystemEvent.EventType.TOUCH_START, this.onTouchStart, this);
systemEvent.on(SystemEvent.EventType.TOUCH_MOVE, this.onTouchMove, this);
systemEvent.on(SystemEvent.EventType.TOUCH_END, this.onTouchEnd, this);
systemEvent.on(SystemEvent.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
}
onTouchStart() {
log('Spr2 onTouchStart');
}
onTouchMove() {
log('Spr2 onTouchMove');
}
onTouchEnd() {
log('Spr2 onTouchEnd');
}
onTouchCancel() {
log('Spr2 onTouchCancel');
}
}
如上所示。但是运行起来的结果是,如果手指的落点先落在sprite1里的话,那么sprite2的触摸监听就无法触发。等我把sprite2上的sprite组件给禁用了之后。也是如此。
请问,这个效果合理吗? sprite1上的节点触摸事件吞噬了sprite2节点上的全局触摸事件。
如果就是这样子设计的话,那么请问我希望达到的效果应该怎么设计才合理?
yangqun.zip (1.0 MB)
附上demo。 场景是Test.scene.

