Swift: Agar.io-подобное плавное движение SKCameraNode?
Если кто-то здесь играл в Agar.io раньше, вы, вероятно, будете знакомы с тем, как движется камера. Он скользит к вашей мыши в зависимости от расстояния, на которое ваша мышь находится от центра экрана. Я пытаюсь воссоздать это движение, используя SKCameraNode и touchMoved:
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 увеличивается ужасным образом, и она не гладкая, и мне просто нужен кто-то, чтобы дать мне небольшой намек на лучший способ сделать это.
1 ответ
Попробуйте линейную интерполяцию. Благодаря линейной интерполяции ваш объект будет медленно и плавно ускоряться или замедляться с течением времени.