2015-06-26 98 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,看起來它尚未設置。