【问题标题】:Swift: Agar.io-like smooth SKCameraNode movement?Swift:类似 Agar.io 的平滑 SKCameraNode 运动?
【发布时间】:2017-06-25 12:38:46
【问题描述】:

如果这里有人玩过 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 变量以一种糟糕的方式递增,而且并不平滑,我只需要有人给我一点提示,告诉我一个更好的方法。

【问题讨论】:

  • 我明白你想要什么,但我不知道怎么做,但是我有一个朋友在做一个具有相同延迟动作的游戏,由于界面指南,它被 Apple 拒绝了.所以注意不要夸大这种效果;用户可能会认为他们的 iPhone 很慢。
  • @CMilby 您能否将其添加为答案以便我接受?我现在因为没有查找最明显的东西而感到愚蠢

标签: ios swift touchesbegan touchesmoved skcameranode


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多