touchesEnded发送给删除的SKNode

时间:2016-09-27 16:33:14

标签: sprite-kit uitouch

在我的场景中,添加和删除了SKNodes(和子类型)。现在,在删除触摸事件但未结束的节点时出现问题。在我的情况下,我点击一个SKSpriteNode,然后从场景中删除精灵。当我现在举起手指(或模拟器中的鼠标按钮)时,应用程序崩溃了。 如何删除包含所有当前UITouches的SKNode?

修改

这是触摸在已删除节点上结束时发生的崩溃: enter image description here

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视图的叠加层。

2 个答案:

答案 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