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 ответ

Решение

Попробуйте линейную интерполяцию. Благодаря линейной интерполяции ваш объект будет медленно и плавно ускоряться или замедляться с течением времени.

Другие вопросы по тегам