【发布时间】:2018-08-13 00:26:01
【问题描述】:
我想计算一个SKSpriteNode 在施加脉冲后的轨迹。我有 12 个球,我想把它们放在球发射后的位置。我正在使用等式????(t)=????₀+t(????₀+½Δt????)+½t²????
我对节点施加的冲动是基于用户在屏幕上拖动的长度。
这是我尝试过的:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
let location = touch.location(in: self)
startPositionDrag = location
}
}
在touchesMoved 中,我更新了轨迹节点以显示如果在该位置启动节点将去往何处。
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
movedLocation = touch.location(in: self)
calculateTrajectoryy(velocityY: (startPositionDrag.y - movedLocation.y), velocityX: (startPositionDrag.x - movedLocation.x))
}
这是我使用方程式的地方。我有一排 12 个球。我使用i 作为时间,因为我想将每个球放在i 秒后节点所在的位置。
func calculateTrajectoryy(velocityY: CGFloat, velocityX: CGFloat){
for i in 0...12{
let time = CGFloat(i)
let accelerationX = CGFloat(0)
let accelerationY = CGFloat(-9.8)
var x = CGFloat()
var y = CGFloat()
// ????(t)=????₀+t(????₀+½Δt????)+½t²????
x = ball.position.x + time * (velocityX + 0.5 * time * accelerationX) + 0.5 * time * time * accelerationX
y = ball.position.y + time * (velocityY + 0.5 * time * accelerationY) + 0.5 * time * time * accelerationY
arrray[i].position = CGPoint(x: x, y: y)
}
}
最后在touchesEnded中,当用户松开拖动时,节点将施加一个脉冲,它应该完全遵循创建的球的路径。
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
let location = touch.location(in: self)
ball.physicsBody?.applyImpulse(CGVector(dx:(startPositionDrag.x - endPositionDrag.x), dy:(startPositionDrag.y - endPositionDrag.y))
}
}
}
球不遵循由球形成的弧线。球射出一点点,而球的弧线又大又长。我认为这可能与单位转换有关。该等式使用以米/秒为单位的速度值,而向后拖动的位置是CGFloat。米会比CGFloat 更长,因此预测的轨迹会更长。我如何能够将轨迹转换为使用像素或CGFloats?有没有可以除以的像素与米的比例?
【问题讨论】:
标签: swift sprite-kit game-physics physics