Swift:像Agar.io一样光滑的SKCameraNode机芯?

Mys*_*ake 9 touchesmoved touchesbegan ios swift skcameranode

如果之前有人玩过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
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这看起来并不太糟糕.但是,这有两个问题.

首先,我想为此使用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
}
Run Code Online (Sandbox Code Playgroud)

我现在需要知道的是从用户触摸屏幕开始平滑增加差异变量的好方法.

编辑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
}
Run Code Online (Sandbox Code Playgroud)

在有任何恶化之前,有人可以帮助我吗?淡入淡出变量以可怕的方式递增而且不顺畅,我只需要有人给我一些更好的方法来做到这一点.

CMi*_*lby 2

尝试线性插值。线性插值可以使您的对象随着时间的推移缓慢而平滑地加速或减速。