Objective-C: Добавление 10 секунд к таймеру в SpriteKit

Я использовал чужой код для написания таймера в 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, добавлял 10 секунд к _countTime и, наконец, снова вызывал createTimerWithDuration:position:andSize: с обновлением _countTime.

Но это, похоже, не сработало для меня. Я полагал, что это будет работать довольно хорошо. Это действительно добавило ко времени 10 секунд, как я и хотел, но таймер начал уменьшаться на три секунды. Подождал бы секунду, потом 15-14-12 БАМ! Подождите секунду, затем 11-10-9 БАМ! И так далее.

Так что же здесь происходит? Был ли это правильный подход? Есть ли лучший способ увеличить время или (еще лучше!) лучший способ создать таймер с такой функцией?


person Christian Kreiter    schedule 11.07.2015    source источник


Ответы (1)


Я считаю, что проблема в том, что вы запускаете действие на «я». Ваше старое действие не удаляется, и оно по-прежнему удаляет время каждую секунду. Попробуй это...

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

и, наконец, вызовите createTimerWithDuration:position:andSize:

Я предполагаю, что вы удаляете старую метку перед повторным вызовом, иначе вы получите действительно странный текст. Когда вы удаляете _countdownClock из его родителя, он также должен удалить действие, и он не будет продолжать уменьшать время и должен решить вашу проблему.

Надеюсь, это поможет.

person Skyler Lauren    schedule 12.07.2015
comment
Вау... Не могу поверить, что я не подумал об этом! Конечно, запуск его на сцене вызовет проблемы. Извините за поздний ответ; Какое-то время у меня не было возможности поработать над ним. Но теперь он работает нормально. Я принял этот ответ! - person Christian Kreiter; 20.07.2015
comment
@ChristianKRider рад, что это сработало. Меня бы эта ошибка с ума свела :) - person Skyler Lauren; 20.07.2015