如何解决这个得分?

时间:2014-04-12 18:51:37

标签: ios objective-c sprite-kit

我正在开发一款游戏,我希望每次在屏幕上添加某些内容时都要计算它。我已设置NSMutableArrays以包含我添加到屏幕的内容。有6个数组,每个数组每x秒生成一个项目。这就是我为得分而设置的内容:

if (!_scoreLabel) {
    _scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"DIN Condensed"];
    _scoreLabel.fontSize = 40;
    _scoreLabel.position = CGPointMake(self.frame.size.width - 20, self.frame.size.height - 40);
    _scoreLabel.fontColor = [SKColor colorWithHue:0 saturation:0 brightness:1 alpha:0.5];
    _scoreLabel.zPosition = 2.0;
    [self addChild:_scoreLabel];
}

//add each debris array
_scoreLabel.text = [NSString stringWithFormat:@"%d", _debris.count + _debris2.count + _debris3.count + _debris4.count + _debris5.count + _debris6.count];

此代码在玩游戏的第一时间(从_debris1 - _debris3开始)正常工作,然后当debris4和其他人开始产卵时,评分未正确添加1相反,它开始添加一堆得分,(如果那令人困惑:对于游戏的第一部分,每当一块碎片添加到游戏中时它会增加1,然后当4和其他人来时,它开始将得分3,7,3(随机数)添加到_scoreLabel

有什么理由为什么这样做? 是否可以将NSMutabaleArray包含所有这些数组作为子项?我应该以不同方式计算此分数吗?

如果需要,这是一个示例spawnDebris方法:

-(void)spawnDebris {

    SKSpriteNode * debris = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:@"debris1.png"] size:CGSizeMake(70, 70)];
    debris.zPosition = 1.0;

    debris.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30];
    debris.physicsBody.allowsRotation = NO;
    debris.physicsBody.categoryBitMask = CollisionDebris;

    RandomPosition = arc4random() %300;
    RandomPosition = RandomPosition + 20;
    debris.position = CGPointMake (RandomPosition, self.size.height + 40);

    [_debris addObject:debris]; //_debris is the NSMutableArray 
    [self addChild:debris];

    //next Spawn:
    [self runAction:[SKAction sequence:@[
        [SKAction waitForDuration:deb1Time],
        [SKAction performSelector:@selector(spawnDebris) onTarget:self],
    ]]];

    if (_dead == YES) {
        [self removeAllActions];
    }

    if (debris.position.y > 568) {
        [self removeFromParent];
    }

先谢谢了。 如果还需要其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

您的问题在于您的代码逻辑。你的spawnDebris方法每隔deb1Time秒递归调用一次,这使它独立。如果您的其他碎片方法以相同的方式运行,那么您无法真正控制何时发生。解决方案是在您的碎片方法中包含[self updateScore],以便在进行更改时更新分数。