Swift: Agar.io-像平滑的 SKCameraNode 运动?
Swift: Agar.io-like smooth SKCameraNode movement?
如果这里有人以前玩过 Agar.io,您可能会熟悉镜头移动的方式。它会根据鼠标距屏幕中心的距离向鼠标滑动。我正在尝试使用 SKCameraNode 和 touchesMoved 重新创建此移动:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
let xDist = pos.x - center.x
let yDist = pos.y - center.y
let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02
camera?.position.x += xDist * distance * 0.02
camera?.position.y -= yDist * distance * 0.02
}
令人惊讶的是,这看起来还不错。但是,这样做有两个问题。
首先,我想为此使用 UIPanGestureRecognizer,因为它在多次触摸时效果更好。我无法想象这是如何做到的,因为我想不出一种方法来使用它来获得从触摸到屏幕中心的距离。
第二个问题是这个动作不流畅。如果用户在一帧内停止移动手指,则会出现巨大的跳跃,因为相机会突然停止。我的数学很糟糕,所以我想不出一种方法来实现一个很好的平滑衰减(或攻击)。
任何帮助都会很棒!
编辑: 我现在正在这样做:
private var difference = CGVector()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y)
}
override func update(_ currentTime: TimeInterval) {
let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.02
camera?.position.x += difference.dx * distance * 0.02
camera?.position.y -= difference.dy * distance * 0.02
}
我现在需要知道的是让差异变量从用户触摸屏幕开始平滑增加的好方法。
编辑 2: 现在我正在这样做:
private var difference = CGVector()
private var touching: Bool = false
private var fade: CGFloat = 0
private func touched(_ touch: UITouch) {
let pos = touch.location(in: view)
let center = view!.center
difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = true
touched(touches.first!)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
touched(touches.first!)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = false
touched(touches.first!)
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = false
}
override func update(_ currentTime: TimeInterval) {
if touching {
if fade < 0.02 { fade += 0.0005 }
} else {
if fade > 0 { fade -= 0.0005 }
}
let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.01
camera?.position.x += difference.dx * distance * fade
camera?.position.y -= difference.dy * distance * fade
}
有人可以在情况变得更糟之前帮助我吗? fade 变量以一种糟糕的方式递增,而且不平滑,我只需要有人给我一点提示,告诉我更好的方法。
尝试Linear Interpolation。线性插值可以使您的对象随着时间的推移缓慢而平稳地加速或减速。
如果这里有人以前玩过 Agar.io,您可能会熟悉镜头移动的方式。它会根据鼠标距屏幕中心的距离向鼠标滑动。我正在尝试使用 SKCameraNode 和 touchesMoved 重新创建此移动:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
let xDist = pos.x - center.x
let yDist = pos.y - center.y
let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02
camera?.position.x += xDist * distance * 0.02
camera?.position.y -= yDist * distance * 0.02
}
令人惊讶的是,这看起来还不错。但是,这样做有两个问题。
首先,我想为此使用 UIPanGestureRecognizer,因为它在多次触摸时效果更好。我无法想象这是如何做到的,因为我想不出一种方法来使用它来获得从触摸到屏幕中心的距离。
第二个问题是这个动作不流畅。如果用户在一帧内停止移动手指,则会出现巨大的跳跃,因为相机会突然停止。我的数学很糟糕,所以我想不出一种方法来实现一个很好的平滑衰减(或攻击)。
任何帮助都会很棒!
编辑: 我现在正在这样做:
private var difference = CGVector()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y)
}
override func update(_ currentTime: TimeInterval) {
let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.02
camera?.position.x += difference.dx * distance * 0.02
camera?.position.y -= difference.dy * distance * 0.02
}
我现在需要知道的是让差异变量从用户触摸屏幕开始平滑增加的好方法。
编辑 2: 现在我正在这样做:
private var difference = CGVector()
private var touching: Bool = false
private var fade: CGFloat = 0
private func touched(_ touch: UITouch) {
let pos = touch.location(in: view)
let center = view!.center
difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = true
touched(touches.first!)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
touched(touches.first!)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = false
touched(touches.first!)
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
touching = false
}
override func update(_ currentTime: TimeInterval) {
if touching {
if fade < 0.02 { fade += 0.0005 }
} else {
if fade > 0 { fade -= 0.0005 }
}
let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.01
camera?.position.x += difference.dx * distance * fade
camera?.position.y -= difference.dy * distance * fade
}
有人可以在情况变得更糟之前帮助我吗? fade 变量以一种糟糕的方式递增,而且不平滑,我只需要有人给我一点提示,告诉我更好的方法。
尝试Linear Interpolation。线性插值可以使您的对象随着时间的推移缓慢而平稳地加速或减速。