cocoscreator 2.1 按钮bug

场景 A < B < C 三层 C层做了事件点击的监听 TOUCH_START 不拦截. 注意这里没有拦截,只是做了监听, 但是A B层的按钮就都不会响应了. 但是 A B层如果做 TOUCH_START 监听还是会接受到消息. 请问这种情况是合理的吗?

NewProject.rar (200.7 KB)

这绝对是个严重的设计bug 啊… 以前做新手引导都是这样做的,现在完全做不了.

这是你的使用问题,在不同节点子树上,事件是不会互相传递的,文档描述得很清晰了,事件模型的传递是自目标节点到根节点的捕获冒泡机制,如果不在目标节点的父节点链上,是不会触发事件的。

你想要的功能实现起来没有你想的那么复杂,应该在根节点 Canvas 上添加捕获阶段事件监听器,在目标节点响应前,先判断目标节点是否应该被点击(是引导阶段的目标按钮)

你可以参考下面修改过的组件,一方面将所有事件都改为了捕获事件,另一方面,在监听器回调中,直接通过 event.target.name 就可以确定是否是你需要的目标按钮。

@ccclass
export default class TakeOverControl extends cc.Component {

    @property(cc.Boolean)
    enable:boolean =  false;

    penetrateSize:Array<cc.Rect>; //穿透矩形

    touchStartFunc:(event: cc.Event.EventTouch)=>void = null;

    touchMoveFunc:(event: cc.Event.EventTouch)=>void = null;

    touchEndFunc:(event: cc.Event.EventTouch)=>void = null;

    touchCancelFunc:(event: cc.Event.EventTouch)=>void = null;

    onLoad(){
        this.node.on(cc.Node.EventType.TOUCH_START, this.touchStart, this, true);
        this.node.on(cc.Node.EventType.TOUCH_MOVE, this.touchMove, this, true);
        this.node.on(cc.Node.EventType.TOUCH_END, this.touchEnd, this, true);
        this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.touchEnd, this, true);
    }


    touchStart(event: cc.Event.EventTouch) {
        if (this.enable) {
            console.log(event.target.name);      
        }
    }

    touchMove(event: cc.Event.EventTouch) {
        if (this.enable) {
            console.log(event.target.name);
            // event.stopPropagation();
        }
    }

    touchEnd(event: cc.Event.EventTouch) {
        if (this.enable) {
            console.log(event.target.name);
            // event.stopPropagation();            
        }
    }

    touchCancel(event: cc.Event.EventTouch) {
        if (this.enable) {
            console.log(event.target.name);
            // event.stopPropagation();
        }
    }

}

老大,麻烦帮忙看下
http://forum.cocos.com/t/topic/65743/17
内存释放问题
最后一楼的问题·········
我实在是不知道什么原因了·····

大佬, 没明白你的意思, 你的意思是在根节点,canvas 上面获取点击的目标节点吗? 那按钮应该都响应完了吧?

明白了, 谢谢大佬, 这个捕获事件还是蛮应景的. 以前不知道还有这个东西.

为什么你这个组件挂接在canvas上后,先接受到触摸事件然后canvas上的子节点才接受到触摸事件,按照官方文档不应该是自节点先接受到触摸事件最后才是根节点canvas接受到触摸事件吗

很奇怪为啥是canvas先接受触摸事件然后才是子节点接受触摸事件

监听的时候,最后一个参数传入了 true,注意到了吗,文档没仔细看吧

翻遍了文档才在node的on函数api说明里面发现一段英文的说明,我估计大部分人都不知道on还有这个参数也不知道还有这种用法

useCapture Boolean When set to true, the listener will be triggered at capturing phase which is ahead of the final target emit, otherwise it will be triggered during bubbling phase.这个说明隐藏的够深的