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

时间:2017-12-29 21:30:13

标签: swift sprite-kit game-physics skphysicsbody skphysicsworld

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

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

2 个答案:

答案 0 :(得分:0)

在SKPhysicsBody术语中,这是force(不断应用)和impulse(即时应用)之间的差异:

  

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

     
      
  • 基于施加力和处理模拟的下一帧之间经过的模拟时间量,施加力一段时间。因此,要对主体应用连续的力,每次处理新帧时都需要进行适当的方法调用。力量通常用于连续效果

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

  •   

(来自'让物理身体从Apple documentation of SKPhysicsBody移动'。)

因此,要对身体施加冲动,从而避免持续加速,请使用applyImpulse方法。

答案 1 :(得分:0)

在您的游戏场景中,添加从touchesBegan调用的新touchesBegan方法。使用touchesEndeddidBegin设置跟踪触摸屏幕时的布尔值。您可以使用场景的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() } } } 方法跟踪玩家何时降落在地面上(或与障碍物碰撞等)。

这样的事情:

typedef enum {
    AST_NODE_INT,
    AST_NODE_FLOAT,
    AST_NODE_ADD,
    // many, many more of these
};

typedef struct _ast_node {
    ast_node_type type;

    union {
        int as_int;
        float as_float;

        struct as_add {
            struct _ast_node *left;
            struct _ast_node *right;
        };

        //more structs, representing the different types in the enum
    };
};