SpriteKit 得分是随机的

SpriteKit score is acting randomly

我正在使用 SpriteKit 创建一个游戏并试图在碰撞时增加分数。出于某种奇怪的原因,每次分数增加都是随机数,而不仅仅是 1。

didBeginContact 方法中,我在子弹和外星人之间发生了碰撞。每次碰撞我都希望分数增加 1。除了它有自己的想法并且会随机增加 1 - 6 之间的数字。我已经完成了每一行代码并尝试添加多次进入游戏,但它不会像我希望的那样增加 1。目前我的代码是这样的。

在我的头文件中,我为乐谱创建了一个 属性:

@property (nonatomic) int score;

然后在我的主要游戏场景中,我添加以下内容

-(void)setScore:(int)score
{
    _score = score;
    _scoreLabel.text = [NSString stringWithFormat:@"%d", score];
}

在我的初始化方法中,我也将分数设置为从 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 内部使用的物理引擎)中,单个接触可以产生相关回调函数的多次调用。

所以你的分值被增加了几次,因为你的方法 didBeginContact 被同一个联系人多次调用。

您可以通过多种方式防止这种行为。 例如。如果你的 Alien 只能被子弹击中一次,你可以 添加一个 BOOL 属性 isAlive 到 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];
        }
    }
}