SpriteKit得分是随机的
我正在用SpriteKit创build一个游戏,试图在碰撞时提高分数。 由于某种奇怪的原因,每次得分增加时都是一个随机数,而不是1。
在didBeginContact
方法中,我有一个子弹和外星人之间的碰撞。 每次碰撞时,我都希望得分将得分增加1.除了有自己的想法,并且会随机地增加1到6之间的数字。我已经经历了每一行代码并尝试添加进入游戏多次,但它不会增加1,因为我也想。 目前我的代码是这样的。
在我的头文件中,我为分数创build了一个属性:
@property (nonatomic) int score;
然后在我的主要游戏场景中,我添加以下内容
-(void)setScore:(int)score { _score = score; _scoreLabel.text = [NSString stringWithFormat:@"%d", score]; }
在我的init方法中,我也将分数设置为从0开始
self.score = 0;
在我的新游戏方法中,我也确保将得分设置回0
self.score = 0;
然后我的碰撞检测看起来像这样。 我用self.score ++增加分数;
if (firstBody.categoryBitMask == kAlienCategory && secondBody.categoryBitMask == kBulletCategory) { //Collision Between Bullet & Alien self.score++; if (firstBody.node) { [self alienExplosion:firstBody.node.position]; [firstBody.node removeFromParent]; } if (secondBody.node) { [self bulletExplosion:secondBody.node.position]; [secondBody.node removeFromParent]; } }
更新:我添加了一个NSLog来显示如何在控制台中更新分数。 它显示了分数是如何在1 – 6之间随机更新的。控制台的屏幕截图显示了分数更新到6,它应该只有1
在Box2D(SpriteKit内部使用的物理引擎)中,单个联系人可以产生多个相关callback函数的调用。
所以你的分数值会增加几次,因为你的方法didBeginContact被多次调用同一个联系人。
你可以用几种方法来防止这种行为。 例如,如果你的外星人只能被子弹击中一次,你可以添加一个BOOL属性isAlive to Alien并且改变你的代码如下。
//Collision Between Bullet & Alien if (firstBody.categoryBitMask == kAlienCategory && secondBody.categoryBitMask == kBulletCategory) { Alien * alien = nil; if ([firstBody.node isKindOfClass:Alien.class]) { alien = (Alien*)firstBody.node } else if ([secondBody.node isKindOfClass:Alien.class]) { alien = (Alien*)secondBody.node } if (alien && alien.isAlive) { alien.isAlive = NO self.score++; if (firstBody.node) { [self alienExplosion:firstBody.node.position]; [firstBody.node removeFromParent]; } if (secondBody.node) { [self bulletExplosion:secondBody.node.position]; [secondBody.node removeFromParent]; } } }