如何保持我的精灵速度不变?

时间:2014-07-12 20:11:56

标签: ios objective-c sprite-kit velocity

我正在使用Sprite Kit制作一个简单的太空射击游戏。我有小行星岩石精灵随机添加到我的场景中。我给他们一定范围内的随机速度。但是,一旦添加到场景中,它们的速度每秒都会降低,最终会停止。当它们靠近屏幕底部时,它们的速度会以较慢的速度减小。我的物理世界的引力设置为(0,0)。

下面的

是将岩石添加到场景中的方法

- (void)addRock {

    SPRockNode *rock = [SPRockNode rock];
    float dy = [SPUtil randomWithMin:SPRockMinSpeed max:SPRockMaxSpeed];
    rock.physicsBody.velocity = CGVectorMake(0, -dy);
    float y = self.frame.size.height + rock.size.height;
    float x = [SPUtil randomWithMin:10 + rock.size.width max:self.frame.size.width - 10 - rock.size.width];
    rock.position = CGPointMake(x, y);
    [self addChild:rock];


}

我在我的场景中设置了物理世界initWIthSize方法

self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0, 0);

下面是我的摇滚节点类的代码

+ (instancetype)rock {

    SPRockNode *rock = [self spriteNodeWithImageNamed:@"rock"];

    rock.name = @"Rock";

    float scale = [SPUtil randomWithMin:50 max:100] / 100.0f;
    rock.xScale = scale;
    rock.yScale = scale;

    NSInteger randomInt = [SPUtil randomWithMin:1 max:3];

    if (randomInt == 1) {

        SKAction *oneRevolution = [SKAction rotateByAngle:-M_PI*2 duration: 1.0];
        SKAction *repeat = [SKAction repeatActionForever:oneRevolution];
        [rock runAction:repeat];

    } else {

        SKAction *oneRevolution = [SKAction rotateByAngle:M_PI*2 duration: 1.0];
        SKAction *repeat = [SKAction repeatActionForever:oneRevolution];
        [rock runAction:repeat];

    }


    [rock setupPhysicsBody];

    return rock;
}



- (void)setupPhysicsBody {

    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
    self.physicsBody.affectedByGravity = NO;
    self.physicsBody.categoryBitMask = SPCollisionCategoryRock;
    self.physicsBody.collisionBitMask = 0;
    self.physicsBody.contactTestBitMask = SPCollisionCategoryProjectile | SPCollisionCategoryShip;


}

关于导致他们减速的原因的任何想法?除了addRock方法之外,我不会在其他任何地方修改它们的速度。是否有空气阻力或类似的东西默认?我只是不明白为什么他们的速度在下降。

1 个答案:

答案 0 :(得分:0)

听起来你遇到线性阻尼问题。

来自SKPhysicsBody参考:

此属性用于模拟身体上的流体或空气摩擦力。该属性必须是介于0.0和1.0之间的值。默认值为0.1。如果值为0.0,则不会对对象应用线性阻尼。

尝试添加此内容:

rock.physicsBody.linearDamping = 0.0f;

值得为SKPhysicsBody类引用至少提供一次读数。它只需要很短的时间,但如果你已经熟悉它的属性和方法,可以节省你很多时间。