Cocos Creator v1.7.2 测试版发布帖(12月21日更新 beta.2)

不太清楚这个情况,请另外发个帖子说明下吧

如何控制,就类似你们在button内的实现.用event.stopPropagation();即可。
你们在最上层中的判断不也是通过这个布尔类型判断是否要停止

关于这点。鼠标和触摸事件是一致的。。。不同点在于触摸事件不会再上层接口处直接调用event.stopPropagation()。而是由相应的控件在接口实现处调用event.stopPropagation()。再看下触摸和鼠标关于点击的处理。在鼠标处理中当判断不为CC_JSB中就直接停止了冒泡。。。我还是那个观点。是否要停止冒泡,就按现在触摸事件的处理方式由控件实现者去实现就可以了。

谢谢反馈,这块确实应该统一一下

@jareguo @524277159 这是代码理解问题,他们的处理是一样的逻辑,都不会传给兄弟节点,只会冒泡给父亲节点

首先说明一下,旧的 Cocos2d 事件系统(cc.eventManager)中有一个 stopPropagation 的接口,但是实际上并不是阻止冒泡,而是阻止事件的继续派发,这是我们的命名有问题,由于在旧的系统中,没有事件 hit test,所以无法判断事件归属,也没有做到真正的冒泡,如果不 stopPropagation,实际上会继续派发给其他所有的监听器(包括兄弟节点和父亲节点)。在 Cocos Creator 中,为了纠正概念,实现真正的捕获冒泡事件模型,我们隔离了 cc.eventManager,这也是为什么我们不希望用户继续使用它,做了两个重要的改动:

  1. 离散事件派发,从一个集约化的派发改为了所有节点(cc.EventTarget 对象)都可以派发
  2. 节点对象的 hit test,以保障可以确定事件归属,并实现捕获冒泡事件模型,这也是为什么兄弟节点之间互相派发无法实现的根本原因,因为一个 touch / mouse 事件只能归属于一个节点

现在,我来解释一下 touch 和 mouse 事件处理器的实现差异,你看到的代码是对旧的 cc.eventManager 监听机制的封装,所以 mouseUpHandler 中的 stopPropagation 实际上是阻止 eventManager 的继续派发(给所有其他监听了的节点)。而 mouseUp 事件的捕获冒泡过程发生在

// 允许冒泡
event.bubbles = true;
// 完整的捕获冒泡派发流程
node.dispatchEvent(event);

在 touchStartHandler 中你也可以看到一样的派发逻辑,但是你看不到 stopPropagation 的原因是不需要这样做,因为我们在 hitTest 成功的情况下 return true,来告知 eventManager touch 触点的归属了,一个触点一旦归属于一个节点,就不会派发给其他监听器。所以不需要 stopPropagation 来阻止 eventManager 的派发,这一切都发生在 eventManager 的内部逻辑中。

这里揭示了 touch 和 mouse 的一个核心区别:

touch 触点有归属,而 mouse 事件没有归属。

总之,目前 touch 和 mouse 对于冒泡的处理逻辑都是完全一致的,具体你的需求如何实现你可以参考一下我的解释

2赞

1.7正式版是所有版本里面最难用的一版(点击节点属性面板不切换!),换个1.7.2试试看…

        ```
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release.    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi    
        Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi          

        ```
        
        1.7.0以上版本,windows 7 clean或者build提示这个错误,有影响吗?

cocos都融天使轮了,怎么能离职 :smirk:

我猜他们是集体出去泡妞了.:laughing:

融资第一波先去度假,666

我按照 @dumganhar 的方法,在试试,然后告诉大家结果。

重新构建,增加了。

  • (BOOL)prefersHomeIndicatorAutoHidden {
    return YES;
    }
    可以了。

mac 1.7.2beta1, 自定义引擎用的1.7.1分支
调用node.schedule方法 会报错.
TypeError: scheduler.isTargetPaused is not a function. (In ‘scheduler.isTargetPaused(this)’, ‘scheduler.isTargetPaused’ is undefined), location: src/jsb_polyfill.js:8980:48
STACK:
schedule@src/jsb_polyfill.js:8980:48

看jsb_polyfill.js报错位置的截图:

我看了下 isTargetPaused方法 并没有js的定义, 也没有js-binding的实现.
这是 什么问题

自定义引擎请用 v1.7-release 分支

使用 自己实现的Node会报错.
我们自己实现了 一个c++的Node 继承自, CCNode, 执行过js-binding绑定了.
现在js那边把他创建成sgNode, 会报错:
ERROR: TypeError: sgNode.setColor is not a function. (In ‘sgNode.setColor(node._color)’,
‘sgNode.setColor’ is undefined), location: src/jsb_polyfill.js:10919:26
STACK:
_appendSgNode@src/jsb_polyfill.js:10919:26
__preload@src/jsb_polyfill.js:10903:29
anonymous
invoke@src/jsb_polyfill.js:16489:23
activateNode@src/jsb_polyfill.js:16582:32
_activate@src/jsb_polyfill.js:6493:50
runSceneImmediate@src/jsb_polyfill.js:30542:28


setColor是CCNode的方法, 这个 方法 也要在子类中 单独实现吗

知道问题了,
在AppDelegate.cpp里面
自己定义的register_xxx 都有放到 jsb_register_all_modules()后面执行.
否则__jsb_cocos2d_Node_proto 这个对象是空的

Mac系统生产工程,windows环境确实不能编译 cocos creator 1.7 有人能试试不? https://github.com/sujiewen/TestCocos

1.6时代就有这个bug

想升级到1.7 下载了一下 1.7.2beta.1版本
以前的 constructor 问题还是调用两次
就用console.err() 进行打印定位到引擎代码块 如图


看到创建构造了两次 一次是绑定@property的 我找到运行文件 注释掉就不会调用两次了

找到引擎代码 CCClassDecorator.js 198行 仔细看了一下 确实是绑定@property的

// CCClassDecorator.js
// member variables
        var defaultValue = undefined;
        var isDefaultValueSpecified = false;
        if (desc) {
            // babel
            if (desc.initializer) {
                // @property(...)
                // value = null;
                defaultValue = getDefaultFromInitializer(desc.initializer);
                isDefaultValueSpecified = true;
            }
            else {
                // @property(...)
                // value;
            }
        }
        else {
            // typescript
            var actualDefaultValues = cache.default || (cache.default = extractActualDefaultValues(ctor));
            if (actualDefaultValues.hasOwnProperty(propName)) {
                // @property(...)
                // value = null;
               defaultValue = actualDefaultValues[propName];
                isDefaultValueSpecified = true;
            }
            else {
                // @property(...)
                // value;
            }
        }

在项目中在构造中 使用@property进行绑定控件 编辑器中查看根本没有显示这个属性
图片:

#麻烦引擎组大大看看那段代码是否多余 附上测试代码TestPro.rar (207.5 KB)

不是说过段时间就发布1.7.1版本的么,都去度假了?

你好,构造确实会进行两遍,这个会有影响吗?这个是设计的一部分,不算是 bug 吧。
你后面那个截图中的红框部分,我看不懂,怎么会在构造参数里调用 property decorator?