2015-06-26 80 views
0

我需要检测用户是否点击了一个精灵节点。Sprite节点没有检测到触摸?

在这里,我创建精灵节点:

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节点向下移动屏幕时,没有任何内容被打印到控制台上。我究竟做错了什么?

回答

1

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

enemy1.name = "enemy1" 

在创建节点后

enemy1 = SKSpriteNode(texture: enemy1Texture) 

权,使其成为

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

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

注意:如果您试图在每个t中访问.Name属性,请小心你应该为你的场景中的每个节点分配一个名称,否则它将为零。或者你也可以检查

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

在另一种方法,您可以检查,如果您按的节点是enemy1节点,但节点应该是可见的功能的touchesBegan这样

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

你是右命名didMoveToView中的节点是问题的一半,另一半是我正在检查节点是否在已经满足的if-else语句的END处被轻敲,因此它没有运行用于触摸节点。谢谢! – skyguy

1

我想你在这里使用userInteractionEnabled不正确。这是完全不必要的,以检测您尝试检测的方式(触摸场景的开始)。我认为touchesBegan是GameScene的方法,因为enemy1是SKSpriteNode,而不是具有实现的touchesBegan方法的SKSpriteNode的子类。

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

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