如何拖动 SKSpriteNode 而不用 Swift 触摸它
How to drag a SKSpriteNode without touching it with Swift
我正在尝试通过拖动水平移动 SKSpriteNode。要了解我试图实现的目标,您可以 watch this。我希望玩家能够在不触摸精灵的情况下拖动精灵。但我真的不知道如何正确实施它。
我尝试做类似的事情:
override func didMoveToView(view: SKView) {
/* Setup your scene here */
capLeft.size = self.capLeft.size
self.capLeft.position = CGPointMake(CGRectGetMinX(self.frame) + self.capLeft.size.height * 2, CGRectGetMinY(self.frame) + self.capLeft.size.height * 1.5)
capLeft.zPosition = 1
self.addChild(capLeft)
let panLeftCap: UIPanGestureRecognizer = UIPanGestureRecognizer(target: capLeft, action: Selector("moveLeftCap:"))
当我设置 moveLeftCap 函数时,我找到的 UIPanGestureRecognizer 代码需要 "View" 并给我一个错误。我还想限制精灵不应通过的最小和最大位置。
有什么想法可以实现吗?
您可能会遇到该错误,因为您不能只从树中的任何节点访问视图。您可以将其称为 scene!.view 或在您的场景中处理手势,如果您想让事情简单化,这是更可取的。
我试了一下,想出了这个基本场景:
import SpriteKit
class GameScene: SKScene {
var shape:SKNode!
override func didMoveToView(view: SKView) {
//creates the shape to be moved
shape = SKShapeNode(circleOfRadius: 30.0)
shape.position = CGPointMake(frame.midX, frame.midY)
addChild(shape)
//sets up gesture recognizer
let pan = UIPanGestureRecognizer(target: self, action: "panned:")
view.addGestureRecognizer(pan)
}
var previousTranslateX:CGFloat = 0.0
func panned (sender:UIPanGestureRecognizer) {
//retrieve pan movement along the x-axis of the view since the gesture began
let currentTranslateX = sender.translationInView(view!).x
//calculate translation since last measurement
let translateX = currentTranslateX - previousTranslateX
//move shape within frame boundaries
let newShapeX = shape.position.x + translateX
if newShapeX < frame.maxX && newShapeX > frame.minX {
shape.position = CGPointMake(shape.position.x + translateX, shape.position.y)
}
//(re-)set previous measurement
if sender.state == .Ended {
previousTranslateX = 0
} else {
previousTranslateX = currentTranslateX
}
}
}
当您在屏幕上移动手指时,圆圈会相应地沿 x 轴移动。
如果您想在 x 和 y 两个方向上移动精灵,请记住从视图中反转 y 值(在视图中向上在场景中向下)。
我正在尝试通过拖动水平移动 SKSpriteNode。要了解我试图实现的目标,您可以 watch this。我希望玩家能够在不触摸精灵的情况下拖动精灵。但我真的不知道如何正确实施它。 我尝试做类似的事情:
override func didMoveToView(view: SKView) {
/* Setup your scene here */
capLeft.size = self.capLeft.size
self.capLeft.position = CGPointMake(CGRectGetMinX(self.frame) + self.capLeft.size.height * 2, CGRectGetMinY(self.frame) + self.capLeft.size.height * 1.5)
capLeft.zPosition = 1
self.addChild(capLeft)
let panLeftCap: UIPanGestureRecognizer = UIPanGestureRecognizer(target: capLeft, action: Selector("moveLeftCap:"))
当我设置 moveLeftCap 函数时,我找到的 UIPanGestureRecognizer 代码需要 "View" 并给我一个错误。我还想限制精灵不应通过的最小和最大位置。 有什么想法可以实现吗?
您可能会遇到该错误,因为您不能只从树中的任何节点访问视图。您可以将其称为 scene!.view 或在您的场景中处理手势,如果您想让事情简单化,这是更可取的。
我试了一下,想出了这个基本场景:
import SpriteKit
class GameScene: SKScene {
var shape:SKNode!
override func didMoveToView(view: SKView) {
//creates the shape to be moved
shape = SKShapeNode(circleOfRadius: 30.0)
shape.position = CGPointMake(frame.midX, frame.midY)
addChild(shape)
//sets up gesture recognizer
let pan = UIPanGestureRecognizer(target: self, action: "panned:")
view.addGestureRecognizer(pan)
}
var previousTranslateX:CGFloat = 0.0
func panned (sender:UIPanGestureRecognizer) {
//retrieve pan movement along the x-axis of the view since the gesture began
let currentTranslateX = sender.translationInView(view!).x
//calculate translation since last measurement
let translateX = currentTranslateX - previousTranslateX
//move shape within frame boundaries
let newShapeX = shape.position.x + translateX
if newShapeX < frame.maxX && newShapeX > frame.minX {
shape.position = CGPointMake(shape.position.x + translateX, shape.position.y)
}
//(re-)set previous measurement
if sender.state == .Ended {
previousTranslateX = 0
} else {
previousTranslateX = currentTranslateX
}
}
}
当您在屏幕上移动手指时,圆圈会相应地沿 x 轴移动。
如果您想在 x 和 y 两个方向上移动精灵,请记住从视图中反转 y 值(在视图中向上在场景中向下)。