在我的场景中,添加和删除了SKNodes(和子类型)。现在,在删除触摸事件但未结束的节点时出现问题。在我的情况下,我点击一个SKSpriteNode,然后从场景中删除精灵。当我现在举起手指(或模拟器中的鼠标按钮)时,应用程序崩溃了。 如何删除包含所有当前UITouches的SKNode? p>
修改
EDIT2:
这是触摸结束时调用的代码:
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
for(UITouch *touch in touches){
if(touch!=activeTouch){continue;} // track only one UITouch
CGPoint tPos = [touch locationInNode:self.parent];
currentlyPressed=NO;
bool touchIsInFrame=CGRectContainsPoint(accumulatedFrame, tPos);
if(clickOnlyValidInsideFrame==NO || touchIsInFrame==YES){
if(block!=nil){
block();
}
if(clickEndedSel!=nil && selectorObj!=nil){
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[selectorObj performSelector:clickEndedSel];
#pragma clang diagnostic pop
}
}
}
}
EDIT3:
我没有解决方案,但有一个解决方法。必须为SpriteKit调用的更新方法安排删除节点。此问题似乎与星座有关,SpriteKit场景被添加为SceneKit视图的叠加层。
答案 0 :(得分:1)
我认为解决这个问题的最佳方法是集中管理UITouch。场景可能是处理UITouches的场景。通过这种方式,您可以避免节点在已经解除分配时调用touchesEnded。您可以在触摸位置测试节点,并在其上调用removeFromParent。
答案 1 :(得分:1)
如果您有一个持有节点的触摸事件,那么您确实应该使用强引用来保留节点,直到事件结束。
如果你能提供代码,我可以给你一个更好的答案,但现在它很简单:
//instance variable
var nodeIsTouched : SKNode?
//inside touch code
...
nodeIsTouched = touchedNode
然后在你的触摸结束事件中,你检查节点是否在现场(除非你有另一种方法来确定它被杀死)。
if node.scene != nil
{
//do touch code
}
else
{
//maybe do some other code
}
nodeIsTouched = nil