Sprite节点没有检测到触摸?

时间:2015-06-26 00:27:36

标签: swift sprite-kit

我需要检测用户是否已点击精灵节点。

这里我创建了一个精灵节点:

var enemy1Texture = SKTexture(imageNamed: "enemy1")
enemy1 = SKSpriteNode(texture: enemy1Texture)
enemy1.setScale(0.3)
enemy1.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 1.2)
        self.addChild(enemy1)

touchesBegan中,我设置了用于检测触摸的变量:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)  {
        /* Called when a touch begins */

        for touch: AnyObject in touches {

            let touch = touches.first as? UITouch
            let location = touch!.locationInNode(self)
            let touchedNode = self.nodeAtPoint(location)
            let touchedNodeName = touchedNode.name

            enemy1.name = "enemy1"
            enemy1.userInteractionEnabled = true

然后在函数的末尾我检查被触摸的精灵节点的名称并尝试执行相应的代码:

if touchedNodeName == "enemy1"  {
    //Enemy touched code
    println("Enemy1 was touched!")          
}

它不起作用。当我在sprite节点向下移动屏幕时点击它,没有任何内容打印到控制台。我做错了什么?

2 个答案:

答案 0 :(得分:1)

我认为你在这里错误地使用了userInteractionEnabled。这是完全不必要的,以便以您尝试检测的方式检测触摸(在场景的touchesBegan中)。我假设touchesBegan是GameScene的方法,因为enemy1是SKSpriteNode而不是SKSpriteNode的子类,并且实现了touchesBegan方法。

在节点上使用userInteractionEnabled允许节点本身接收触摸。如果你决定这样做,你需要实现touchesBegan:在那个特定的对象上(如上所述,你必须继承SKSpriteNode)。但我想这不是这里的情况而不是你想要的。请注意,nodeAtPoint基于触摸位置(场景默认接收触摸),它会告诉您某个位置是否有任何节点,它不关心该节点是否接收到触摸。

所以,从您发布的代码中,我会说您必须正确设置节点名称,以便在touchesBegan方法中检查它。只需在创建敌人之后在didMoveToView方法中命名您的节点,因为目前您正在尝试使用 node.name ,它看起来还没有设置。

答案 1 :(得分:1)

在Point创建的touchNodeName变量中,enemy1节点的名称没有设置Name属性。移动

enemy1.name = "enemy1"

之后立即创建节点
enemy1 = SKSpriteNode(texture: enemy1Texture)

所以它变成了

enemy1 = SKSpriteNode(texture: enemy1Texture)
enemy1.name = "enemy1"

然后当你得到touchedNode.name时,你可以检查它是否是“enemy1”

注意:如果您尝试在每次触摸中访问.Name属性时要小心,您应该为场景中的每个节点指定一个名称,否则它将为零。或者你可以检查

if(touchedNode.Name != nil){
     //Then get the .Name variable and perform your checks
}

在另一种方法中,您可以检查您按下的节点是否为enemy1节点,但节点应该在touchesBegan函数中可见,如下所示

if(touchedNode == enemy1){
    //Your code here
}