【问题标题】:How can I keep my sprites velocity constant?我怎样才能保持我的精灵速度恒定?
【发布时间】:2014-07-12 20:11:56
【问题描述】:

我正在 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 方法,我不会在其他任何地方修改它们的速度。默认情况下是否有空气阻力或类似的东西?我只是不明白为什么他们的速度正在下降。

【问题讨论】:

    标签: ios objective-c sprite-kit velocity


    【解决方案1】:

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

    来自 SKPhysicsBody 参考:

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

    尝试添加这个:

    rock.physicsBody.linearDamping = 0.0f;
    

    至少阅读一次 SKPhysicsBody 类参考是值得的。它只需要很短的时间,但如果您熟悉它的属性和方法,可以为您节省大量时间。

    【讨论】:

    • 太棒了。我会检查一下,看看它是否能在我回来时解决我的问题。我之前通读了物理世界和身体文档,因为我认为它是这样的,但我一定错过了。谢谢!
    • 成功了!谢谢一堆。线性阻尼是物理物体的属性,而不是物理世界的属性。
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多