Метка не меняет таймер обратного отсчета SpriteKit Objective C?

Редактировать № 2. Хорошо, я думаю, что я довел это до сути. Я воспользовался всеми вашими советами и проверил с точками останова, так что спасибо.

Последнее, что мне нужно сделать, это запустить это действие ожидания.

if (timerStarted == YES) {

    [countDown runAction:[SKAction waitForDuration:1]];
    if (countDownInt > 0) {
    countDown.text = [NSString stringWithFormat:@"%i", countDownInt];
    countDownInt = countDownInt - 1.0;
    [self Timer];

    }else{
        countDown.text = [NSString stringWithFormat:@"Time Up!"];
    }

Раздел runAction: не работает. Я предполагаю, что это потому, что я выбрал неправильный узел для размещения вместо (SKLabelNode "countDown"). Какой узел я могу использовать для запуска этого кода?

Спасибо всем, кто помог до сих пор


person Community    schedule 29.11.2014    source источник
comment
Что не так? Что ж, пока timeLeft > 0, вы создаете совершенно новый узел метки каждый кадр, не удаляя старые. Через одну секунду вы получите около 60 ярлыков. У вас должна быть одна метка, и вы должны обновить только свойство текста этой метки.   -  person LearnCocos2D    schedule 29.11.2014


Ответы (2)


Вот пример того, как реализовать таймер обратного отсчета в SpriteKit.

Во-первых, объявите метод, который создает 1) узел метки для отображения оставшегося времени и 2) соответствующие действия для обновления метки, ожидания в течение одной секунды и полоскания/намыливания/повторения.

- (void) createTimerWithDuration:(NSInteger)seconds position:(CGPoint)position andSize:(CGFloat)size {
    // Allocate/initialize the label node
    countDown = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
    countDown.position = position;
    countDown.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
    countDown.fontSize = size;
    [self addChild: countDown];
    // Initialize the countdown variable
    countDownInt = seconds;
    // Define the actions
    SKAction *updateLabel = [SKAction runBlock:^{
        countDown.text = [NSString stringWithFormat:@"Time Left: %ld", countDownInt];
        --countDownInt;
    }];
    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:^{
        countDown.text = @"Time's Up";
    }];
}

а затем вызовите метод с продолжительностью (в секундах) и положением/размером метки.

CGPoint location = CGPointMake (CGRectGetMidX(self.view.frame),CGRectGetMidY(self.view.frame));
[self createTimerWithDuration:20 position:location andSize:24.0];
person 0x141E    schedule 29.11.2014

Я бы не стал использовать метод обновления. Используйте SKActions, чтобы создать таймер. Для примера

id wait = [SKAction waitForDuration:1];
id run = [SKAction runBlock:^{
    // After a second this is called
}];
[node runAction:[SKAction sequence:@[wait, run]]];

Несмотря на то, что это будет выполняться только один раз, вы всегда можете встроить это в SKActionRepeatForever, если хотите, чтобы его вызывали каждую секунду или любой другой интервал времени. Источник: SpriteKit — Создание таймера

person SierraMike    schedule 29.11.2014
comment
Я не уверен, как я могу реализовать это с кодом выше - person ; 29.11.2014
comment
Итак, где бы вы ни захотели запустить свой таймер. Создайте действие, которое ждет (с любым интервалом времени, который вы хотите). Затем второе действие — это то, что вы хотите сделать после того, как вы подождали x количество времени. Вы можете поместить свою настройку кода метки обратного отсчета внутри этого блока запуска и уменьшить int где-нибудь, который содержит текущее время. Затем сделайте еще одно действие, которое будет повторять эти действия навсегда. Поставьте галочку внутри того же блока кода, что и ваша метка, которая говорит, что если currentTime ‹= 0, то остановите действия. - person SierraMike; 29.11.2014
comment
Подождите, извините за беспокойство, какой объект я должен поставить в качестве узла? - person ; 29.11.2014
comment
Сцена, в которой вы сейчас находитесь. - person SierraMike; 29.11.2014