2016-07-10 9 views
0

私にはSKSpriteNodeがあります。このSKSpriteNodeには複数の子供がいます。タッチされたかどうかをどのように検出できますか?さて、SpriteKitにボタンを設定することはすでに分かっています。メインの親ノードに触れたかどうかを検出するのに使ったのと同じコードを使ってみましたが、うまくいきませんでした。ボタンは何もしません。これを修正する方法はありますか?また、私はすでに、子ノードのユーザー対話をtrueに設定しようとしました。子ノードがタッチされたかどうかを検出する方法:スプライトキット

答えて

2

ここでは、連続したタッチ(矢印など)を追跡する方法の1つです。

あなたは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あなたはそれが迅速な2でコンパイルされないという事実を指していますか? –

0

あなたはこの方法にあなたがタッチイベントを監視したいすべてのノードに関連付けられたクラスの

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

を実装する必要があります。したがって、このメソッドをメインの子孫のすべてに追加する必要がありますSKSpriteNode

+0

このコードは何もしません。 –

+0

@ LukeVanIn:自分のメソッドにプリントを追加しました。ヒントありがとうございます。 –

+0

「タッチイベントを監視するすべてのノードに関連付けられたクラスでこのメソッドを実装する」とはどういう意味ですか?このメソッドをメインのSKSpriteNodeのすべての子孫に追加する必要がありますか?コード内のどこにありますか?私は印象の下でtouchesBeganはSKViewでしか動作しませんでした...しかし、私は混乱しています... – Confused

関連する問題