Swift 如何制造一个不';t不断地加速物体,使其快速旋转

Swift 如何制造一个不';t不断地加速物体,使其快速旋转,swift,sprite-kit,game-physics,skphysicsbody,skphysicsworld,Swift,Sprite Kit,Game Physics,Skphysicsbody,Skphysicsworld,所以我想制造一个力,在场景中移动一个物理物体,而不是不断地加速它们。就像几何短跑一样。所以,当我使用重力时,它就像坠落一样,但我不希望它像那样加速 希望你能理解,这有点难以解释。 感谢您在SKPhysicsBody术语中,这是力(持续施加)和脉冲(瞬时施加)之间的区别: 您可以选择应用力或脉冲: 根据应用力与处理下一个模拟帧之间经过的模拟时间量,应用力的时间长度。因此,要对实体应用连续力,需要在每次处理新帧时进行适当的方法调用。力通常用于连续效果 冲量会使物体的速度发生瞬时变化,这与经过的模

所以我想制造一个力,在场景中移动一个物理物体,而不是不断地加速它们。就像几何短跑一样。所以,当我使用重力时,它就像坠落一样,但我不希望它像那样加速

希望你能理解,这有点难以解释。
感谢您

在SKPhysicsBody术语中,这是
(持续施加)和
脉冲
(瞬时施加)之间的区别:

您可以选择应用力或脉冲:

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

  • 冲量会使物体的速度发生瞬时变化,这与经过的模拟时间无关。脉冲通常用于物体速度的即时变化

(从“使物理体移动”开始)


因此,为了给你的身体施加一个脉冲,从而避免持续加速,请使用该方法。

在游戏场景中,添加一个新的
jump()
方法,该方法从
touchesbeated
调用。使用
触摸开始
触摸结束
设置触摸屏幕时跟踪的bool。您可以使用场景的
didbeagin
方法跟踪玩家何时落地(或与障碍物碰撞等)

大概是这样的:

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()
        }
    }
}
类游戏场景:SKScene,skphysiccontactdelegate{
var person=SKSpriteNode()
var isJumping=Bool()
var isTouching=Bool()
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
isTouching=true
跳转()
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
isTouching=false
}
func jump(){
如果isTouching==true{
如果isJumping==false{
person.physicsBody?applyImpulse(CGVector(dx:0,dy:600))
是真的吗
}
}
}
func didbegen(uu联系人:skphysiccontact){
让bodyA=contact.bodyA.node
设bodyB=contact.bodyB.node
//与地面相撞
如果bodyA?.physicsBody?.categoryBitMask==2和bodyB?.physicsBody?.categoryBitMask==1{
isJumping=false
跳转()
}
}
}

所以我使用了applyImpulse并将平台和玩家摩擦力设置为0,这样就不会影响这一点。