SpriteKit得分是随机的

时间:2015-01-11 04:15:07

标签: ios objective-c sprite-kit game-physics

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

didBeginContact方法中,子弹与外星人发生碰撞。每次碰撞时我都希望得分能够将得分提高1.除非它有自己的想法,并且会随机增加1到6之间的数字。我已经完成了每一行代码和我试图多次将评分添加到游戏中,但它也不会像我希望的那样增加1。目前我的代码是这样的。

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

@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

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

在Box2D(SpriteKit内部使用的物理引擎)中,单个联系人可以对相关的回调函数进行多次调用。

因此,您的分数值会多次递增,因为同一联系人会多次调用 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];
        }
    }
}