如何在Swift中将Speed设置为“ moveTo”方法?

时间:2018-08-02 21:57:49

标签: ios swift sprite-kit

嘿:)我想在Swift中创建我的第一个游戏应用程序,但遇到了问题。 在屏幕上,每侧应有两个球。当我触摸显示器时,它们将移动到另一个球的位置。当我停止触摸显示屏时,它应该停留在原位。

我尝试使用“ moveTo”方法,但是我不希望它需要每个位置都需要“持续时间”。即使球在屏幕中间或屏幕3/4(x位置)上,也有类似“速度”的东西吗?

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    leftBall.run(SKAction.moveTo(x: frame.maxX - rightBall.size.width * 2, duration: 2))
    rightBall.run(SKAction.moveTo(x: frame.minX + leftBall.size.width * 2, duration: 2))
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    leftBall.removeAllActions()
    rightBall.removeAllActions()
}

3 个答案:

答案 0 :(得分:0)

我对SKAction资料一无所知,但是:

速度定义为距离除以时间。换句话说:时间(=持续时间)是距离除以速度。

您可以构建一个简单的函数,以距离和速度作为返回持续时间的参数。

也许是这样吗?:

  func duration(speed: Double, distance: Double) -> Double {
    return distance/speed
  }

  let someSpeed: Double = 2.0 // = 2px/timebase
  let someDistance: Double = 1.0 // this value can be fixed in fact inside the function becaus it is just some kind of "resolution"

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    leftBall.run(SKAction.moveTo(x: ballsOldPosition.x+someDistance, duration: duration(speed: someSpeed, distance: someDistance)))
  }

或者我在您的问题中遗漏了什么?

答案 1 :(得分:0)

在这里可以看到一个简单的具有恒定速度运动的Sprite-Kit应用程序的答案:https://stackoverflow.com/a/45694380/1430420,并查看控制导弹运动的代码。

一般来说,您都有一个属性来定义对象的速度:

let missileSpeed: CGFloat = 800 // Points per second)

然后是一个辅助函数,以给定的速度计算对象移动到目的地所需的时间:

let missileFlightTime = travelTime(to: missileDestination, from: ship.position, at: missileSpeed)

这是辅助函数:

func travelTime(to target : CGPoint, from start : CGPoint, at speed : CGFloat) -> TimeInterval {
   let distance = hypot(target.x - start.x, target.y - start.y)
   return TimeInterval(distance/speed)
    }

,然后使用计算出的时间定义moveTo SKAction:

let missileMove = SKAction.move(to: missileDestination,
                                duration: TimeInterval(missileFlightTime))

答案 2 :(得分:0)

如果您的球具有SKPhysicsBody,则可以设置速度而不是使用动作

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    leftBall.physicsBody!.velocity = CGPoint(x:frame.maxX - rightBall.size.width * 2,y:0.0)
    rightBall.physicsBody!.velocity = CGPoint(x:frame.maxX - rightBall.size.width * 2,y:0.0)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    leftBall.physicsBody!.velocity = CGPoint.zero
    rightBall.physicsBody!.velocity = CGPoint.zero
}

如果要使球永久移动,则必须关闭linearDamping,摩擦和重力。

此外,由于速度是基于米而不是点,因此您可能不得不使用数字