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 识别器)中