Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocos2d iphone 有没有办法将CCSprite子级转移到另一个父级?_Cocos2d Iphone - Fatal编程技术网

Cocos2d iphone 有没有办法将CCSprite子级转移到另一个父级?

Cocos2d iphone 有没有办法将CCSprite子级转移到另一个父级?,cocos2d-iphone,Cocos2d Iphone,如果我有一个以前添加到父CCNode或CCLayer的CCSprite,有没有办法更改其父对象 我试着做: [self setParent:newParent]; 然后: [parent removeChild:self cleanup:YES]; [newParent addChild:self]; 两者都不起作用。。。后者实际上会导致崩溃。我认为,如果先删除(不清除),然后添加到新的父级,应该可以工作 我假设在第二种情况下,您将自动释放对象添加到父对象。在这种情况下,精灵将在从父级删除

如果我有一个以前添加到父CCNode或CCLayer的CCSprite,有没有办法更改其父对象

我试着做:

[self setParent:newParent];

然后:

[parent removeChild:self cleanup:YES];
[newParent addChild:self];

两者都不起作用。。。后者实际上会导致崩溃。

我认为,如果先删除(不清除),然后添加到新的父级,应该可以工作

我假设在第二种情况下,您将自动释放对象添加到父对象。在这种情况下,精灵将在从父级删除后被删除,因此您将无法将其添加到另一个父级。试试这个

[self retain];
[self removeFromParentWithCleanup:YES];
[newParent addChild: self];
[self release];

如果发生错误崩溃,请在将来发布崩溃消息。这有助于解决问题

不清理不是简单地说不叫“停止清理”吗?为什么清理:是会导致它不工作?如果是,则会维护操作和计划的选择器。当你做选择2时,你会遇到什么样的“崩溃”?CCNode是否在抱怨(查看日志)?您必须注意CCSpriteBatchNodes的子-父关系。在这种情况下,父对象和子对象必须来自同一个纹理。我得到这样的信息:“NSInternalInconsistencyException”,原因是:“委托已添加到touch dispatcher”。因此,我猜当精灵作为子对象添加时,它的oneter方法将被调用,该方法现在正在touch dispatcher上调用AddTargetedElegate。我在查看可用的方法,但找不到任何布尔属性来确定是否已将节点添加为目标委托…这超出了我对cocos内部工作的了解。您可以尝试[[CCDirector sharedDispatcher].touchDispatcher forceRemoveDelegate:self],但我担心您会从一个惊喜到下一个惊喜。默认情况下,CCSprite根本不会作为任何触摸代理添加。如果在OneNet方法中手动将其注册为触摸代理,请确保在onExtir方法中将其从触摸代理中删除。我不认为自动删除的对象清理得那么快(即,清理是runloop循环过程的一部分)。请参见上面的注释了解崩溃原因。AFAIK,autorelease对象在添加到autorelease池的勾号末尾接收释放消息=)无论如何,您可以尝试保留autorelease对象,然后在任何其他勾号中释放它并尝试将其用作对象)我想您将得到错误=)