2

所以我想创造一种力量来移动场景中的物理对象,而不需要不断地加速它们。就像几何破折号一样。因此,当我使用重力时,它就像坠落一样,但我不希望它像那样加速。

希望你明白,这有点难以解释。谢谢

4

2 回答 2

0

force在 SKPhysicsBody 术语中,这是 a (持续应用)和 an impulse(即时应用)之间的区别:

您可以选择施加力或冲动:

  • 根据施加力和处理模拟的下一帧之间经过的模拟时间量,施加力的时间长度。因此,要对物体施加连续的力,您需要在每次处理新帧时进行适当的方法调用。力通常用于连续效果

  • 脉冲对身体的速度产生瞬时变化,与经过的模拟时间量无关。脉冲通常用于立即改变身体的速度。

(来自SKPhysicsBody 的 Apple 文档中的“让物理体移动” 。)

因此,要对您的身体施加一个脉冲,从而避免持续加速,请使用方法applyImpulse

于 2017-12-30T08:25:41.627 回答
0

在您的游戏场景中,添加一个jump()名为 from 的新方法touchesBegan。使用touchesBegantouchesEnded设置当您触摸屏幕时跟踪的布尔值。您可以使用didBegin场景的方法来跟踪玩家何时降落在地面上(或与障碍物碰撞等)。

像这样的东西:

class GameScene: SKScene, SKPhysicsContactDelegate {
    var person = SKSpriteNode()
    var isJumping = Bool()
    var isTouching = Bool()

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        isTouching = true
        jump()
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        isTouching = false
    }

    func jump(){
        if isTouching == true {
            if isJumping == false {
                person.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 600))
                isJumping = true
            }
        }
    }

    func didBegin(_ contact: SKPhysicsContact) {
        let bodyA = contact.bodyA.node
        let bodyB = contact.bodyB.node

        // Collided with ground
        if bodyA?.physicsBody?.categoryBitMask == 2 && bodyB?.physicsBody?.categoryBitMask == 1 {
            isJumping = false
            jump()
        }
    }
}
于 2017-12-30T21:33:29.927 回答