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]; } } }