SpriteKit 中的 UIPanGesture

Posted

技术标签:

【中文标题】SpriteKit 中的 UIPanGesture【英文标题】:UIPanGesture In SpriteKit 【发布时间】:2018-12-04 14:59:11 【问题描述】:

我正在尝试让一个球 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】:

请注意,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

【讨论】:

以上是关于SpriteKit 中的 UIPanGesture的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 UIScrollView 内的 UIPanGesture

使用 UIPanGesture 将图像的位置存储到 Objc 中 UIView 中的新位置

将 UIView 拖放到另一个(UIPanGesture 识别器)中

当 UIPanGesture 上的状态为 .ended 时遍历数组

UipanGesture 不适用于 Uiswitch

仅在 iPhone 上水平添加 UIPanGesture