【问题标题】:how to get the force being applied on an object in SpriteKit (Swift)如何在SpriteKit(Swift)中对对象施加力
【发布时间】:2018-06-06 20:36:19
【问题描述】:

所以我对 SpriteKit 有点陌生,我想知道如何获取对象上的力并将其放入变量中。当你对一个对象施加力时,例如这段代码,

line.physicsBody?.applyImpulse(CGVector(dx: 0, dy: -30))

它会询问您每个方向的数量。好吧,我想做相反的事情。我想得到物体的力量大小和方向。

【问题讨论】:

    标签: swift xcode sprite-kit


    【解决方案1】:

    一种冲动,一种持续一瞬间的力量。物体只有在相对于它的速度和质量发生碰撞时才能对另一个物理体施加力。

    如果您希望找到对象当前的平均速度,您可以使用 sprite.physicsbody?.velocity

    或者您可以检查对象是否正在移动

    physicsbody?.isResting
    

    如果要计算帧之间施加在对象上的平均力,则必须计算上次更新周期之间位置变化的幅度,然后乘以对象的质量,就像这样。

    var lastPosition: CGPoint?
     var avgForce: CGPoint?
    
    func updatedForce(for sprite: SKSprite, timeDelta: Double) {
    guard let lastPosition = lastPosition, let currentVelocity = currentVelocity) else {
    lastPosition = sprite.position
    }
    
    let position = sprite.position
    let mass = sprite.physicsbody.mass
    var changeInX = position.x - lastPosition.x
    var changeInY = position.y - lastPosition.y
    avgForce = CGPoint(x: changeInX * mass, y: changeInY * mass)
    }`
    

    对于任何格式问题或拼写错误,我深表歉意,这是用我的 iPhone 制作的,稍后会更正。

    【讨论】:

    • 新问题,有没有办法让物体完全停止所有运动。
    • 您可以将其速度设置为 CGPoint.zero 和/或设置physicsbody.dynamic = false
    • 将速度设置为零将停止运动,但不会阻止重力等其他力加速它。将 dynamic 设置为 false 将阻止重力和其他物理对象/力被物理模拟应用或检查。
    • 如何以编程方式将速度设置为零
    • spriteObject.PhysicsBody.velocity = CGPoint.zero 如果我没记错的话