这是我在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的主更新循环之外。