新手求助,动态添加的节点不加载脚本

如题,刚才试着运行自己写的demo的时候发现bug。

同时通过对象池产生三个气泡,onLoad函数里写着初始化后向上运动,但是每次只有最后一个气泡会向上运动。
经调试发现是onLoad中的代码没有执行。

实在是不明白,为什么有的会执行有的不会呢…
有哪位大神可以指点一下吗?非常感谢的说~

我猜猜,你代码里面是不是用了 for 循环并且用var定义的循环变量:)

三个气泡都是用self.spawnBubble();生成的,for循环里的循环变量是用let定义的。
实在是搞不懂的说orz

代码贴出来看看

for 循环里面有延时类的操作就会出现这问题你for里面生命的变量如果有延时,最后传入的都是最大值

只在初始化对象池的时候使用了for循环,其他部分没用for循环的说。
调试里看到脚本组件是有好好挂在节点上面的,为什么里面的代码就不执行呢orz

switch (this.roundCount) {
case 2:
this.node.runAction(cc.sequence(
cc.callFunc(function () {
self.spawnBubble();
}),
cc.delayTime(1),
cc.callFunc(function () {
self.spawnBubble();
}),
));
break;
case 3:
this.node.runAction(cc.sequence(
cc.callFunc(function () {
self.spawnBubble();
}),
cc.delayTime(1),
cc.callFunc(function () {
self.spawnBubble();
}),
cc.delayTime(1),
cc.callFunc(function () {
self.spawnBubble();
}),
));
break;
}
气泡生成数量为2的时候能正常运行,生成3个就不行了…

没有addChild就不会执行onLoad

新生成的节点设置成game节点的子节点了

spawnBubble
写了什么贴出来我看看

// 生成一个气泡
spawnBubble: function () {
var self = this;
// 从对象池中请求一个气泡
var newBubble = this.bubblePool.get();
this.node.addChild(newBubble);
newBubble.setPosition(this.getBubblePos());
// 得到图案
var pattern = newBubble.getComponentInChildren(cc.Sprite);
// 产生随机图案
var randNum = Math.floor(Math.random() * 3 + 1);
cc.loader.loadRes(‘res_2b/shape’, cc.SpriteAtlas, function (err, atlas) {
var frame = atlas.getSpriteFrame(‘img_2_shape_’ + self.shapeKind + randNum.toString());
pattern.spriteFrame = frame;
});

    // 触摸气泡时
    newBubble.on('touchend', function (event) {
        newBubble.stopAllActions();
        // 播放音频
        self.audioSplash.play();
        self.audioWord.play();
        // 播放帧动画
        var clickAnim = newBubble.getComponent(cc.Animation);
        clickAnim.play();
        newBubble.runAction(cc.sequence(
            cc.delayTime(0.8),
            cc.scaleTo(0.3, 0, 0),
            cc.callFunc(function () {
                self.bubblePool.put(newBubble);
            }),
        ));

        // 添加屏蔽层
        var newBlock = self.blockPool.get();
        self.block.addChild(newBlock);
        newBlock.setPosition(newBubble.getPosition());
        newBubble.runAction(cc.sequence(
            cc.delayTime(1.1),
            cc.callFunc(function () {
                self.blockPool.put(newBlock);
            }),
        ));

        // 逻辑更新
        self.alreadyCount++;
        // 本轮已完成时
        if (self.alreadyCount == self.roundCount) {
            // 非最后一轮时
            if (self.roundCount != 3) {
                self.roundCount++;
                self.alreadyCount = 0;
                self.roundStart();
            }
            // 最后一轮时
            else {
                // 场景完成
                glo.finished[glo.currentScene] = 1;
                let i = 0;
                for (; i < 4; i++) {
                    if (glo.finished[i] == 0) {
                        break;
                    }
                }
                // 场景全部完成时
                if (i == 4) {
                    // 重置全局变量
                    glo.order = [];
                    glo.finished = [];
                    glo.currentScene = -1;
                    // 设置动作
                    var finishAction = cc.sequence(
                        cc.spawn(
                            cc.scaleTo(0.25, 1, 1.25),
                            cc.moveTo(0.25, 0, 10)
                        ),
                        cc.spawn(
                            cc.scaleTo(0.25, 1, 0.8),
                            cc.moveTo(0.25, 0, 0)
                        ),
                        cc.delayTime(1),
                    );
                    self.shade.runAction(cc.sequence(
                        cc.callFunc(function () {
                            self.audioJump.play();
                            self.audioMagic.play();
                        }),
                        cc.callFunc(function () {
                            self.word.runAction(finishAction);
                        }),
                        cc.delayTime(1),
                        cc.callFunc(function () {
                            self.audioWord.play();
                        }),
                        cc.delayTime(2),
                        cc.fadeIn(0.5),
                        cc.callFunc(function () {
                            cc.director.loadScene('finish');
                        }),
                    ));
                }
                // 场景未全部完成时
                else {
                    if (glo.currentScene == 3) {
                        glo.currentScene = 0;
                    }
                    else {
                        glo.currentScene++;
                    }
                    self.shade.runAction(cc.sequence(
                        cc.callFunc(function () {
                            self.audioJump.play();
                            self.audioMagic.play();
                        }),
                        cc.callFunc(function () {
                            self.word.runAction(finishAction);
                        }),
                        cc.delayTime(1),
                        cc.callFunc(function () {
                            self.audioWord.play();
                        }),
                        cc.delayTime(2),
                        cc.fadeIn(0.5),
                        cc.callFunc(function () {
                            cc.director.loadScene(glo.scenes[glo.currentSection][glo.order[glo.currentScene]]);
                        }),
                    ));
                }
            }
        }
    }, this);
},

@stepmine_king 我刚才加了几行代码调试的时候发现 有的节点不只是不执行脚本,根本都不显示在画面上:joy:
可以的话请帮忙看一下,谢谢了

直觉是loadRes的延迟问题,你先把loadRes独立出来,在刚进场景时,将该load的动态resource全部载完后,存在变数中(一个array或object都行),动态产生节点时,需要图片就直接从变数拿,别再loadRes了。

我需要动态产生东西时,都是这样做的,目前都没遇过问题。

@stepmine_king 好的,我去试一试。谢谢啦~

@stepmine_king
在game.js的onLoad()里把所有资源加载了
但还是一样的情况,产生三个泡泡的时候无法显示和执行
真是太费解了:joy:

新手观察:
这段话很值得怀疑啊, pattern是用var来的声明的, 在异步不够快的时候很容易被指向乱七八糟的地方啊.

是不是这一段, 试试改成:
let newBubble = this.bubblePool.get();
let pattern = newBubble.getComponentInChildren(cc.Sprite);

@imBug
刚刚改过来试了一下,但是结果没有变化的说
设置断点发现三个spawnBubble()都有执行,但只有最后一个能显示出正常效果:joy:
谢谢帮忙啦

贴上你新的CODE给我看看

如果只有最后一个会触发,很大可能是因为前面的都被后面的盖过去了

// 生成一个气泡
spawnBubble: function (posX, posY) {
var self = this;
let newBubble = this.bubblePool.get();
this.node.addChild(newBubble);
newBubble.setPosition(posX, posY);
// 产生随机图案
let randNum = Math.floor(Math.random() * 3);
let pattern = newBubble.getComponentInChildren(cc.Sprite);
pattern.spriteFrame = this.shapes[randNum];

    // 触摸气泡时
    newBubble.on('touchend', function (event) {
        newBubble.stopAllActions();
        // 播放音频
        self.audioSplash.play();
        self.audioWord.play();
        // 播放帧动画
        var clickAnim = newBubble.getComponent(cc.Animation);
        clickAnim.play();
        newBubble.runAction(cc.sequence(
            cc.delayTime(0.8),
            cc.scaleTo(0.3, 0, 0),
            cc.callFunc(function () {
                self.bubblePool.put(newBubble);
            }),
        ));

        // 添加屏蔽层
        var newBlock = self.blockPool.get();
        self.block.addChild(newBlock);
        newBlock.setPosition(newBubble.getPosition());
        newBubble.runAction(cc.sequence(
            cc.delayTime(1.1),
            cc.callFunc(function () {
                self.blockPool.put(newBlock);
            }),
        ));

        self.alreadyCount++;
        // 本轮已完成时
        if (self.alreadyCount == self.roundCount) {
            // 非最后一轮时
            if (self.roundCount != 3) {
                self.roundCount++;
                self.alreadyCount = 0;
                self.roundStart();
            }
            // 最后一轮时
            else {
                // 场景完成
                glo.finished[glo.currentScene] = 1;
                let i = 0;
                for (; i < 4; i++) {
                    if (glo.finished[i] == 0) {
                        break;
                    }
                }
                // 场景全部完成时
                if (i == 4) {
                    // 重置全局变量
                    glo.order = [];
                    glo.finished = [];
                    glo.currentScene = -1;
                    // 设置动作
                    var finishAction = cc.sequence(
                        cc.spawn(
                            cc.scaleTo(0.25, 1, 1.25),
                            cc.moveTo(0.25, 0, 10)
                        ),
                        cc.spawn(
                            cc.scaleTo(0.25, 1, 0.8),
                            cc.moveTo(0.25, 0, 0)
                        ),
                        cc.delayTime(1),
                    );
                    // 执行动作
                    self.shade.runAction(cc.sequence(
                        cc.callFunc(function () {
                            self.audioJump.play();
                            self.audioMagic.play();
                        }),
                        cc.callFunc(function () {
                            self.word.runAction(finishAction);
                        }),
                        cc.delayTime(1),
                        cc.callFunc(function () {
                            self.audioWord.play();
                        }),
                        cc.delayTime(2),
                        cc.fadeIn(0.5),
                        cc.callFunc(function () {
                            cc.director.loadScene('finish');
                        }),
                    ));
                }
                // 场景未全部完成时
                else {
                    // 是最后一个场景时
                    if (glo.currentScene == 3) {
                        glo.currentScene = 0;
                    }
                    // 不是最后一个场景时
                    else {
                        glo.currentScene++;
                    }
                    // 执行动作
                    self.shade.runAction(cc.sequence(
                        cc.callFunc(function () {
                            self.audioJump.play();
                            self.audioMagic.play();
                        }),
                        cc.callFunc(function () {
                            self.word.runAction(finishAction);
                        }),
                        cc.delayTime(1),
                        cc.callFunc(function () {
                            self.audioWord.play();
                        }),
                        cc.delayTime(2),
                        cc.fadeIn(0.5),
                        cc.callFunc(function () {
                            cc.director.loadScene(glo.scenes[glo.currentSection][glo.order[glo.currentScene]]);
                        }),
                    ));
                }
            }
        }
    }, this);
},

// 开始新的一轮
roundStart: function() {
var self = this;
switch (this.roundCount) {
case 2:
this.node.runAction(cc.sequence(
cc.delayTime(1),
cc.callFunc(function () {
self.spawnBubble(-200 + 100 * cc.randomMinus1To1(), -533);
}),
cc.callFunc(function () {
self.spawnBubble(200 + 100 * cc.randomMinus1To1(), -533);
}),
));
break;
case 3:
this.node.runAction(cc.sequence(
cc.delayTime(1),
cc.callFunc(function () {
self.spawnBubble(-250 + 80 * cc.randomMinus1To1(), -533);
}),
cc.callFunc(function () {
self.spawnBubble(100 * cc.randomMinus1To1(), -533);
}),
cc.callFunc(function () {
self.spawnBubble(250 + 80 * cc.randomMinus1To1(), -533);
}),
));
break;
}
},

@stepmine_king
把资源提前加载了,其他的部分改动不大

如果将switch里的code改成用schedule实现如何?

@stepmine_king
刚刚试了一下,结果没有变化orz