2016-07-10 117 views
0

我有一個SKSpriteNode。這SKSpriteNode有幾個孩子。我如何檢測它是否被觸摸?現在,讓我清楚,我已經知道在SpriteKit中設置一個按鈕,我嘗試使用與用於檢測主父節點是否已被觸摸的代碼相同的代碼,但它不起作用。該按鈕不做任何事情。有沒有辦法來解決這個問題?另外,我已經嘗試將用戶交互設置爲對於子節點爲true。如何檢測是否有子節點被觸摸:Sprite Kit

回答

2

這裏是跟蹤連續觸摸(即方向箭頭)的一種方法。

你需要跟蹤的觸摸,在SKScene節點,或者在父視圖控制器:

var touches = Set<UITouch>() 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

對於每個觸摸的座標轉換爲相對SKNode。檢查是否有任何觸摸位於SKNode的累積幀內。累積幀是節點及其所有後代的總邊界區域。

private func isTouching(node: SKNode) -> Bool { 

    guard let parent = node.parent else { 
     return false 
    } 

    let frame = node.calculateAccumulatedFrame() 

    for touch in touches { 

     let coordinate = touch.location(in: parent) 

     if frame.contains(coordinate) { 
      return true 
     } 
    } 

    return false 
} 

例如:

override func update(_ currentTime: NSTimeInterval) { 

    let touchingJump = isTouching(node: jumpButtonNode) 

    if touchingJump { 
     print("jump") 
    } 
} 
+0

此代碼不編譯 –

+0

@appzYourLife也不應該。你想說什麼? –

+0

@appzYourLife您是否指的是它不能用swift 2編譯的事實? –

0

你需要實現這個方法

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    print("Touched") 
} 

的關聯要監視觸摸事件的每一個節點類。因此,您應該將此方法添加到主SKSpriteNode的每個後代中。

+0

此代碼不會做任何事情。 –

+0

@LukeVanIn:我給我的方法添加了一個打印。謝謝你的提示。 –

+0

你是什麼意思「實現這個方法在關聯到你監視觸摸事件的每個節點的類上」所以你應該將這個方法添加到你的主SKSpriteNode的每個後代?那代碼在哪裏?我以前的印象touchesBegan只適用於SKView ...但我很困惑... – Confused