2017-07-03 76 views
2

我想弄明白如何檢測shapeNode是否被按下,特別是與LongPress手勢。請看下面的代碼。任何想法有什麼不對,爲什麼我看不到「找到!」信息?UILongPressGestureRecognizer與SpriteKit

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

我可能是錯的,但是你在做'view.scene?.frame'時,你可以只做'.frame' :) – Fluidity

回答

1

您目前正在計算視圖座標系中的龍頭位置。爲了在場景的座標系中工作(因爲SKShapeNode被添加到場景),你有一個抽頭位置從視圖中的座標系統轉換到場景的座標系統,就像這樣:

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

無關的原來的問題,但需要記住的一點是,強制解包並不是大多數情況下的好主意(有時它在開發階段時會有所幫助),而且您應該傾向於以安全的方式訪問選項的底層值(使用if let syntax例如)。

+0

呃,總是強制unwrap'.view'。所以很討厭這個。 – Fluidity

+1

......背後有理由,如果你正在過渡場景?解壓會導致應用程序崩潰 – Knight0fDragon

+1

@Whirlwind,這完美地解決了我的問題。非常感謝! – RafalK