2017-07-03 27 views
2

私はshapeNodeが押されたかどうか、特にLongPressジェスチャーを検出する方法を理解しようとしています。以下のコードを見てください。どんな考えが間違っているのか、なぜ私は "Found"を見ることができませんか?メッセージ?SpriteKitを使用したUILongPressGestureRecognizer

class Test: SKScene { 
    let longPressGesture = UILongPressGestureRecognizer() 

    override func didMove(to view: SKView) { 

     longPressGesture.addTarget(self, action: #selector(GameScene.longPress)) 
     self.view?.addGestureRecognizer(longPressGesture) 

     let testPath = UIBezierPath(rect: CGRect(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!, width: 2 * 50.0, height: 2 * 50.0)).cgPath 

     let testNode = Node.init(path: testPath, nodeName: "TEST") 
     testNode.fillColor = UIColor.brown 
     testNode.position = CGPoint(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!) 

     self.addChild(testNode) 
    } 

    func longPress(_ sender: UILongPressGestureRecognizer) { 
     let longPressLocation = sender.location(in: self.view) 

     if sender.state == .began { 
      for child in self.children { 
       if let shapeNode = child as? SKShapeNode { 
        if shapeNode.contains(longPressLocation) { 
         print("Found!") 
        } 
       } 
      } 
     } else if sender.state == .ended { 
      print("ended") 
     } 
    } 
} 

何か助けてくれてありがとうございました!

+0

私は間違っているかもしれませんが、単に '.frame'を行うことができるときに' view.scene?.frame'をやっています:) – Fluidity

答えて

1

現在、ビューの座標系でタップの位置を計算中です。シーンの座標系で働くためには(SKShapeNodeがシーンに追加されているため)、あなたはこのように、シーンの座標系にビューの座標系からタップ位置を変換する必要があります。元の問題とは無関係の

let longPressLocation = convertPoint(fromView: sender.location(in: self.view)) 

が、心に留めておくべきことは、強制アンラッピングは大抵の場合、良いアイデアではない(時には開発フェーズで役立つこともある)、安全な方法でオプションの基礎となる値にアクセスする傾向があることである例えば)。

+0

ugh、常に強制的にアンラップ '.view'をします。だからそれを守るのは面倒です。 – Fluidity

+1

...そこには理由があります。シーンを切り替えるとどうなりますか?力のアンラップはあなたのアプリをクラッシュさせます – Knight0fDragon

+1

@Whirlwind、これは完全に私の問題を解決します。どうもありがとうございます! – RafalK

関連する問題