在不同容器节点之间移动的节点具有scene = nil

时间:2015-01-24 22:58:33

标签: ios objective-c sprite-kit ios7.1

这是我在iOS 7.1中的Sprite Kit中遇到的问题。它不会发生在iOS 8.1中,所以我相当肯定它是7.1的错误,但我需要一种解决方法来保持兼容性。

我从一个中队容器节点中删除一个太空飞船精灵,然后将其添加回场景。我打开了SKScene上的showsPhysics,这样我就可以看到发生了什么。一旦船从中队中断,物理调试显示器就会跳到整个地方,即使船看起来处于正确的位置。不幸的是,它不是调试显示的错误,因为分离的physicsBody现在正在控制行为。我可以将我自己的船撞到调试圈中,这个圈位于屏幕中间,来自独立的敌人。

以下是问题的开始:

-(void)breakFromSquadron{

CGPoint pos = [self positionInScene];
GameScene *scene = [self gameScene];

[self removeFromParent]; // removes ship from squadron (which is a child node of the node kWorldLayerShips, which is a child of the scene)

SKNode *layerNode = self.scene.layers[kWorldLayerShips]; 
[layerNode addChild:node]; // add ship directly as child of node layer 

self.position = pos;

}

在调试器中通过这些步骤分析属性,检查父项和场景时,所有内容都会检出,但在下一次更新中,如果我检查场景(调试器中的po self.scene),结果为nil。

正如我所说,这不是iOS 8.1中的问题,只是7.1。

[UPDATE] 在Apple Developer支持的帮助下,我现在有一个解决方法。从容器节点中删除sprite时,设置一个(boolean)标志,指示需要删除sprite。在下一个更新循环中,检查标志是否已设置,如果是,则使用[self removeFromParent]将其删除。准备好添加时再设置另一个标志,再次在更新循环中添加标志。问题似乎是由回调块触发的这些操作引起的,因此它们发生在iOS 7的主更新循环之外。

0 个答案:

没有答案