使用nodepool,把用过的节点put进去,在get出来,把get出来的节点加到别的节点里报错
child already added. It can’t be added again
put不是会调用removeFromParent吗,我在unuse里手动调用removeFromParent也没用
使用nodepool,把用过的节点put进去,在get出来,把get出来的节点加到别的节点里报错
child already added. It can’t be added again
put不是会调用removeFromParent吗,我在unuse里手动调用removeFromParent也没用
刚才看了源码,
CCNodePool.js
里这一句
obj.removeFromParent(false);
没有起作用,不知道为啥,改成下面这样就好就好了
if (obj.parent !== null) {
obj.parent = null;
}
谁能告诉我为啥啊
改成上面那样会报错,虽然不影响结果,但是看的不爽啊,继续看
在base-node.js里parent的set有这么一段
if (oldParent) {
if (!(oldParent._objFlags & Destroying)) {
var removeAt = oldParent._children.indexOf(this);
if (CC_DEV && removeAt < 0) {
return cc.error('Internal error, should not remove unknown node from parent.');
}
oldParent._children.splice(removeAt, 1);
oldParent.emit(CHILD_REMOVED, this);
this._onHierarchyChanged(oldParent);
}
}
一个array里都是object,直接indexOf返回的永远是0啊,这一段有什么意义啊,没整明白,求大神教啊
这里应该没问题,indexOf 获取的是当前节点在旧的 parent 中的位置,如果存在就删除,返回0,就表示在第一个节点的位置
回到你的问题,put 的确会 removeFromParent,这里足够避免 child already added 问题了,可以发一下你具体的使用代码吧
就是按照教程来的
createMahjong: function (location, status, typeId, isSmall, clickCb) {
let mahjong = null;
if (this.mahjongPool.size() > 0) {
mahjong = this.mahjongPool.get();
cc.log(mahjong.height);
} else {
mahjong = cc.instantiate(this.mahjongPrefab);
}
mahjong.getComponent('Mahjong').init(location, status, typeId, isSmall, clickCb);
return mahjong;
},
但是array的元素是object的时候indexOf的结果不是始终是-1吗,这么写好像不行啊
使用nodepool之后立即输出这个node的parent,不是空的,还是保持着上一次put时的parent
谢谢!
找到问题了,我想把一个list里所有的item全部put掉,但是我是用pop取的,真是sb
用pop是错在哪里呢
知道错在哪里了吗,我也遇到了这个问题
楼主应该是用的for循环i=0去 put,但是用的pop,pop会改变数组长度,导致i++时有些元素没有被put
好吧 和我的不是一个问题
我这边也报了一样的错 Internal error, should not remove unknown node from parent.
一开始我用的数组, push 和pop
后边改成noodpool也不行
cocos大佬!
楼主是parentNode.children.pop() 取的节点
这莫取父节点children里找不到这个节点了,但是当前node的父节点还是parentNode
if (oldParent) {// 这里有父节点
if (!(oldParent._objFlags & Destroying)) {
var removeAt = oldParent._children.indexOf(this); // 但是父节点没有这个子节点
if (CC_DEV && removeAt < 0) {
return cc.error(‘Internal error, should not remove unknown node from parent.’); // 就走到了这里
}
oldParent._children.splice(removeAt, 1);
oldParent.emit(CHILD_REMOVED, this);
this._onHierarchyChanged(oldParent);
}
}
在base-node.js 里setParent 走到这段代码的时候会出问题