嘿:)我想在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()
}
答案 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,摩擦和重力。
此外,由于速度是基于米而不是点,因此您可能不得不使用数字