记录Cocos Creator未解问题和无解问题

因为我问的问题都是无解的,为了不让其他人浪费时间问同样的问题,我就记录一下目前引擎的未解/无解问题吧。
时不时心血来潮了会更新一下。

1、【未解】【2019-8-22】Spine骨骼动画可以和自身相同动画节点合并drawcall,但是不能和其它的渲染组件合并,即使用的是同一张纹理。

2、【未解】【2019-8-22】一个粒子系统就是一个drawcall,既无法和自身相同粒子系统节点合并也无法和其它渲染组件合并,即使用的是同一张纹理。

3、【未解】【2019-8-22】微信/百度小游戏不支持动态合图,因为adapter里面将cc.macro.CLEANUP_IMAGE_CACHE = true,官方的解释如下:

4、【未解】【2019-8-22】动态合图的管理方式让人有点费解,动态创建新的cc.Sprite时cc.dynamicAtlasManager会自动帮你把spriteFrame加到它“当前操作的合图中”,如果“当前操作的合图中”中没有该spriteFrame就加上去,问题是缓存合图操作过的spriteFrame不是交给cc.dynamicAtlasManager管理的,导致每张动态纹理都有可能出现重复的图片。个人觉得很浪费,也许有官方有自己的考虑吧,我已经自己重新定制了。

5、【无解】【2019-8-22】华为快游戏不支持WebView组件(iframe)。因为华为Runtime不支持。

6、【未解】【2019-8-22】触摸事件里有一个swallowTouches的字段,但是创建事件时被写死为true,其它地方没法设置,意味着节点一旦有触摸事件其下层节点永远无法被触摸,或者触摸事件被打断,这对一些情境来说很不友好。举个例子:一些塔防游戏中,长按某空白处需要持续开炮,松开停止开炮,假设此时长按地图某个点开始持续开炮,这时有个敌人刚好移动到了这个点,而这个敌人身上是有触摸事件的,那这个敌人就会打断触摸事件,这时再松开手指,开炮也不会停止,因为永远收不到TouchEnd消息,敌人swallowTouches(吞并了所有触摸事件)。两个嵌套的Scrollview无法同时滑动除了_stopPropagationIfTargetIsMe另外就是这个swallowTouches的问题了。

1赞

火钳刘明。。

1赞

mark

1赞

关于swallowTouches其实是可以设置的 只不过提示文件里面没有添加而已 其实可以设置

hungryAndFoolish.zip (2.2 MB)关于第六点,我做了一个deemo,并没有出现你说的问题啊。creator版本2.0.9

补充几个:

  • Uncaught TypeError: window.requestAnimFrame is not a function

https://forum.cocos.com/t/vivo-window-requestanimframe/77984/25

https://forum.cocos.com/t/2-1-1-android-uncaught-typeerror-window-requestanimframe-is-not-a-function/78109/9

  • 图片黑边+透明度

https://forum.cocos.com/t/cocos-creator/81924/8
https://forum.cocos.com/t/ccc2-1-x/82444/2

  • 压缩纹理导致资源丢失

https://forum.cocos.com/t/topic/82414/14

https://forum.cocos.com/t/2-1-1/78625/5

竟然有人回我,很是兴奋啊。
抱歉,swallowTouches那个问题我描述得有问题。我改了一下你的demo。新的描述在demo的注释里也说的很清楚。
hungryAndFoolish.zip (487.4 KB)

关键代码:

   //点击开火
    this.bigNode.on('touchstart',()=>{
        cc.log('touchstart big');
    });

    //移动同“点击”,只是位置实时变化
    this.bigNode.on('touchmove',()=>{
        cc.log('touchmove big');
    });

    //如果touchstart的初始节点是bigNode必然触发touchend事件
    this.bigNode.on('touchend',()=>{
        cc.log('touchend big');
    });

    //如果touchstart的初始节点不是bigNode必然不会触发touchend事件,但是touchstart依然会触发,touchmove事件也会正常触发
    this.bigNode.on('touchcancel',()=>{
        cc.log('touchcancel big');
    });

    /**
     * 下面使用两种方式测试各个事件是否能正常触发
     * 前提:touchstart的初始节点为怪物节点 —— 那些移动的节点(此前提下touchend是不会触发的,重点是看touchcancel是否能触发)
     * 测试步骤:
     * 1、点击任意移动的节点
     * 2、等待有移动节点被销毁
     * 3、此时松开,查看能否正常触发touchcancel事件
     */

    //方式一:动态创建节点,并定时销毁节点,此方式下touchcancel在touchstart的初始节点被销毁后就无法触发了
    this.littleNode.active = false;
    let count = 0;
    let maxCount = 5;
    let generate = function(){
        if(count >= maxCount)
        {
            return;
        }
        let enermyNode = cc.instantiate(this.littleNode);
        enermyNode.parent = this.bigNode;
        enermyNode.active = true;
        enermyNode.on('touchstart',()=>{
            cc.log('touchstart littleNode');
        });
        enermyNode.on('touchend',()=>{
            cc.log('touchend littleNode');
        });
        enermyNode.runAction(cc.sequence(cc.moveTo(10, cc.v2(960,0)), cc.callFunc(function(){
            enermyNode.removeFromParent();
            count --;
        })));
        count ++;
    };
    this.schedule(generate, 3);

    //方式二:使用常驻动态节点,此方式下touchcancel会被正常触发
    // this.littleNode.on('touchstart',()=>{
    //     cc.log('touchstart littleNode');
    // });
    // this.littleNode.on('touchend',()=>{
    //     cc.log('touchend littleNode');
    // });
    // cc.tween(this.littleNode).then(
    //     cc.tween().by(10,{position:cc.v2(960,0)}).
    //     by(10,{position:cc.v2(-960,0)})
    // ).repeatForever().start();

嗯,但是为什么不公开这个字段呢,也没有任何文档说明就默默地swallowTouches了:sweat_smile:

物理引擎,刚体堆叠抖动导致散架问题

我觉得应该是不会出现你说的这种情况啊,你能提供一个deemo给我看看吗?

cocos的点击事件是有归属的,点下的那一刻,就意味着归属于littleNode。bigNode能够响应到相对应的事件,并不是因为你点到了bigNode,而是因为bigNode是littleNode的父节点。上传中…
上传中…
https://docs.cocos.com/creator/manual/zh/scripting/internal-events.html