SpriteKit中的UIPanGesture

时间:2018-12-04 14:59:12

标签: swift sprite-kit uipangesturerecognizer

我正在尝试使球SKSpriteNode在所有方向(包括对角线和所有其他方向)上移动。 UIGesture无法使用它,因此我需要使用UIPanGesture,但是我不知道如何将其实现到SpriteKit文件中。 到目前为止,这就是我所拥有的。有帮助吗?球形精灵节点称为“球形”。

func handlePan(recognizer:UIPanGestureRecognizer) {
  let translation = recognizer.translation(in: self.view)
  if let view = recognizer.view {
    view.center = CGPoint(x:view.center.x + translation.x,
                            y:view.center.y + translation.y)
  }
  recognizer.setTranslation(CGPoint.zero, in: self.view)
}

1 个答案:

答案 0 :(得分:0)

请注意,SpriteKit和UIKit具有完全不同的坐标系(Spritekit是笛卡尔坐标,UIKit反映在X轴上),因此,未经转换就无法在Spritekit中使用UIKit坐标。幸运的是,SKScene和SKNode具有将SKView和其他SKNode的点转换为节点本地空间的方法。

@objc private func pan(_ recognizer: UIPanGestureRecognizer) {
    let pointInView = recognizer.location(in: view)
    let pointInScene = convertPoint(fromView: pointInView)

    switch recognizer.state {
    case .began:
        //Start dragging on the ball, or ignore this gesture
        isPanning = atPoint(pointInScene) == ball
    case .changed:
        //Move the ball
        guard isPanning else {
            return
        }
        let translation = recognizer.translation(in: view)
        ball.position.x -= translation.x
        ball.position.y += translation.y
        recognizer.setTranslation(.zero, in: view)
    case .cancelled, .ended:
        //Stop dragging
        isPanning == false
    default:
        break
}

我在GitHub上有完整的示例:https://github.com/joshuajhomann/AngryBirdsClone