Objective-C:在SpriteKit中为计时器添加10秒

时间:2015-07-11 20:20:06

标签: objective-c time timer sprite-kit seconds

我使用其他人的代码在SpriteKit中编写一个计时器,并稍微调整一下。这是我的代码的样子:

- (void)createTimerWithDuration:(NSInteger)seconds position:(CGPoint)position andSize:(CGFloat)size
{
    // Allocate/initialize the label node.
    _countdownClock = [SKLabelNode labelNodeWithFontNamed:@"Avenir-Black"];
    _countdownClock.fontColor = [SKColor blackColor];
    _countdownClock.position = position;
    _countdownClock.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
    _countdownClock.fontSize = size;
    [self addChild:_countdownClock];

    // Initialize the countdown variable.
    _countdown = seconds;

    // Define the actions.
    SKAction *updateLabel = [SKAction runBlock:^{
        _countdownClock.text = [NSString stringWithFormat:@"Time Left: 0:%lu", (unsigned long)_countdown];
        _countdown--;
    }];

    SKAction *wait = [SKAction waitForDuration:1.0];

    // Create a combined action.
    SKAction *updateLabelAndWait = [SKAction sequence:@[updateLabel, wait]];

    // Run action "seconds" number of times and then set the label to indicate the countdown has ended.
    [self runAction:[SKAction repeatAction:updateLabelAndWait count:seconds] completion:^{
        _countdownClock.text = @"GAME OVER!";
        _gameOver = YES;
        [self runAction:_gameOverSound];
    }];
}

我想要发生的是,当某个代码块运行时(我自己已经处理过),我想为计时器添加10秒钟。

我尝试这样做,通过添加一个名为_countTime的常量实例变量,最初保持60秒。在-init方法中,我调用了[self createTimerWithDuration:_countTime position:_centerOfScreen andSize:24];在这个函数中,每次"秒"我都会减少_countTime。会减少 - 换句话说,每一秒,_countTime会减少。当我运行阻止时,阻止添加10秒的时间,我将删除_countdownClock,向_countTime添加10秒,最后再次调用createTimerWithDuration:position:andSize:,更新_countTime

但这似乎对我有用。我认为它会运作得相当好。 做了 加上10秒的时间,就像我想要的那样,但计时器会开始下降三分之一。它会等一下,然后15-14-12 BAM!然后等一下,然后11-10-9 BAM!等等。

那么这里发生了什么?这是正确的方法吗?有没有更好的方法来增加时间,或者( 更好! )更好的方法来创建一个具有这样功能的计时器?

1 个答案:

答案 0 :(得分:2)

我认为这个问题是因为你在" self"上运行了这个动作。你的旧动作没有被移除,它仍然每秒消除时间。试试这个......

[_countdownClock runAction:[SKAction repeatAction:updateLabelAndWait count:seconds] completion:^{
    _countdownClock.text = @"GAME OVER!";
    _gameOver = YES;
    [self runAction:_gameOverSound];
}];
  

最后调用createTimerWithDuration:position:andSize:

我假设你在再次打电话之前删除旧标签,否则你会得到一些非常奇怪的文字。当您从父级移除_countdownClock时,它也应该删除该操作,并且不会减少时间并且应该解决您的问题。

希望这有帮助。