如何制作一个不会不加速物体的力SpriteKit Swift

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作一个不会不加速物体的力SpriteKit Swift相关的知识,希望对你有一定的参考价值。

所以我想制作一个能够在场景中移动物理对象而不会不断加速它们的力。就像几何破折号一样。因此,当我使用重力时,它就像摔倒,但我不希望它像那样加速。

希望你明白,解释起来有点棘手。谢谢

答案

在SKPhysicsBody术语中,这是force(经常应用)和impulse(瞬间应用)之间的区别:

你可以选择施加一种力量或一种冲动:

  • 基于在施加力和处理模拟的下一帧之间经过的模拟时间量,施加力一段时间。因此,要对主体应用连续的力,每次处理新帧时都需要进行适当的方法调用。力量通常用于连续效果
  • 脉冲使身体的速度瞬间变化,这与已经过的模拟时间量无关。脉冲通常用于立即改变身体的速度。

(摘自Apple documentation of SKPhysicsBody的“让物理身体移动”。)

因此,为了对你的身体施加冲动,从而避免不断加速,请使用方法applyImpulse

另一答案

在你的游戏场景中,添加一个从jump()调用的新touchesBegan方法。使用touchesBegantouchesEnded设置一个在触摸屏幕时跟踪的bool。您可以使用场景的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()
        }
    }
}

以上是关于如何制作一个不会不加速物体的力SpriteKit Swift的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit中的加速度计不起作用

实现与帧率无关的加速

unity2d给物体施加多大的力或速度才能让物体回到原位?

硬件架构设计 | 加速度计

未检测到 spritekit 物理碰撞

V-rep中的加速度计与陀螺仪