我正在使用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方法之外,我不会在其他任何地方修改它们的速度。是否有空气阻力或类似的东西默认?我只是不明白为什么他们的速度在下降。
答案 0 :(得分:0)
听起来你遇到线性阻尼问题。
来自SKPhysicsBody参考:
此属性用于模拟身体上的流体或空气摩擦力。该属性必须是介于0.0和1.0之间的值。默认值为0.1。如果值为0.0,则不会对对象应用线性阻尼。
尝试添加此内容:
rock.physicsBody.linearDamping = 0.0f;
值得为SKPhysicsBody类引用至少提供一次读数。它只需要很短的时间,但如果你已经熟悉它的属性和方法,可以节省你很多时间。