在你提供的代码中,有一个问题可能导致循环内移除节点出现问题。问题在于当移除节点后,循环继续执行,但是此时i并未更新,可能会导致索引越界或其他错误。
为了解决这个问题,你可以使用break关键字来跳出当前循环,避免继续执行后续代码。在 autoAddItemToPlayer() 函数中添加一个布尔变量来判断是否成功移除物品,并将其作为返回值传递给主循环函数 onClick_btnAutoAddItem()。如果成功移除物品,则在外部循环中直接使用 return 结束整个函数。
以下是修改后的代码示例:
onClick_btnAutoAddItem() {
// ...
let collectAll = false;
for (let index = 0; index < 12; index++) {
let children = this["shopBoard" + index].children;
for (let i = children.length - 1; i >= 0; i--) {
// ...
if (containerId == nodeContainerId) {
if (collectAll) {
return;
} else {
// ...
collectAll = this.autoAddItemToPlayer(tarPlayer, itemN);
if (collectAll) {
return; // 直接结束整个函数
}
}
}
}
}
}
autoAddItemToPlayer(palyerTar, node) {
// ...
if (canSetPos != -1) {
// ...
tween(node)
.to(0.3, { position: targetPos })
.call(() => {
// ...
if (node.parent) {
this.shopBoardTab[node.parent.name]--;
this.shopBoardSingleUpdate(node.parent.name);
itemTar.children[0].getChildByName("itemMask").active = false;
node.removeFromParent();
if (canSetPos == 2) {
// ...
return true; // 成功移除物品,返回true
}
}
})
.start();
}
return false; // 默认未成功移除物品,返回false
}
通过这样的修改,当成功移除物品后,会直接跳出主循环,并且不会继续执行剩余代码。
内容由零声教学AI助手提供,问题来源于学员提问




