停止SKSpriteNode减速

时间:2015-03-10 19:33:45

标签: ios sprite-kit skspritenode skphysicsbody skphysicsworld

我试图让我的SKSpriteNodes永远保持恒定速度,即使在碰撞之后也是如此。我将重力设置为0,摩擦设置为0,线性和角度阻尼设置为零,但精灵仍然慢慢减速到零速度。我怎么能让他们继续前进?

根据下面的答案,这是我尝试过的: 编辑以下代码有效!我只需检查节点是否比限制更慢并加速它们。

[self enumerateChildNodesWithName:kBallName usingBlock:^(SKNode *node, BOOL *stop)
    {
        SKSpriteNode *ball = (SKSpriteNode *)node;
        if (ball.physicsBody.velocity.dx < 0) {
            if (ball.physicsBody.velocity.dx > -50)
                ball.physicsBody.velocity = CGVectorMake(-50, ball.physicsBody.velocity.dy);
        }
        if (ball.physicsBody.velocity.dx > 0) {
            if (ball.physicsBody.velocity.dx < 50)
               ball.physicsBody.velocity = CGVectorMake(50, ball.physicsBody.velocity.dy);
        }
        if (ball.physicsBody.velocity.dy < 0) {
            if (ball.physicsBody.velocity.dy > -50)
                ball.physicsBody.velocity = CGVectorMake(ball.physicsBody.velocity.dx, -50);
        }
        if (ball.physicsBody.velocity.dy > 0) {
            if (ball.physicsBody.velocity.dy > 50)
                ball.physicsBody.velocity = CGVectorMake(ball.physicsBody.velocity.dx, 50);
        }
    }];

2 个答案:

答案 0 :(得分:1)

如果将脉冲应用于节点的物理主体,则仅应用一次。想想踢球。另一方面,施加力就像连续推动,就像移动汽车的引擎一样。请记住,如果继续施加力,您的节点将变得越来越快,因此您必须在某个时刻指定速度限制。你可以这样做:

if(myNode.physicsBody.velocity.dx > 300)
    myNode.physicsBody.velocity = CGVectorMake(300, myNode.physicsBody.velocity.dy);

这将限制你的行动权利&#34;速度达到300。

另一个选择是通过更改位置来手动移动节点。您可以使用myNode.position = CGPointMake(myNode.position.x+1, myNode.position.y);之类的内容来完成此操作。每次运行代码时,这将使您的节点向右移动。

答案 1 :(得分:0)

将节点的恢复属性设置为1.0。恢复原状是在碰撞后保留节点能量的多少。

https://developer.apple.com/library/mac//documentation/SpriteKit/Reference/SKPhysicsBody_Ref/index.html#//apple_ref/occ/instp/SKPhysicsBody/restitution

示例:

marble_node.physicsBody?.restitution = 1.0  

默认恢复原状是0.2。将它改为1.0将使事情变得非常有弹性!