scheduledtimer scheduled example objective-c time timer sprite-kit seconds

objective-c - timer.scheduledtimer swift 4 example



Objective-C: Agregar 10 segundos al temporizador en SpriteKit (1)

Usé el código de otra persona para escribir un temporizador en SpriteKit, y lo puse un poco ajustado. Así es como se ve mi código:

- (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]; }]; }

Lo que quiero que suceda es que cuando se ejecuta cierto bloque de código (que yo mismo he solucionado), quiero agregar 10 segundos al temporizador.

Intenté hacer esto, ya, agregando una variable de instancia constante llamada _countTime para mantener inicialmente 60 segundos. En el método -init, llamé [self createTimerWithDuration:_countTime position:_centerOfScreen andSize:24]; Dentro de esta función, disminuiría _countTime cada vez que los "segundos" disminuirían; en otras palabras, cada segundo, el _countTime disminuiría. Cuando hice ejecutar el bloque, el bloque para agregar 10 segundos al tiempo, eliminaría el _countdownClock , agregaría 10 segundos al _countTime , y finalmente llamaría a createTimerWithDuration:position:andSize: nuevo, con la actualización _countTime .

Pero esto no pareció funcionar para mí. Pensé que funcionaría bastante bien. Agregó 10 segundos al tiempo, exactamente como yo quería, pero el temporizador empezaría a bajar de tres en tres. ¡Esperaría un segundo, luego 15-14-12 BAM! Luego espera un segundo, luego 11-10-9 BAM! Y así.

Entonces, ¿qué está pasando aquí? ¿Fue este el enfoque correcto? ¿Hay una mejor manera de aumentar el tiempo o ( mejor aún ) una mejor manera de crear un temporizador que tenga una función como esta?


Creo que el problema se debe a que está ejecutando la acción en "sí mismo". Tu acción anterior no se elimina y todavía está eliminando el tiempo cada segundo. Prueba esto...

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

y finalmente llame a createTimerWithDuration: position: andSize:

Supongo que está eliminando la etiqueta anterior antes de llamar de nuevo, de lo contrario, obtendría un texto realmente extraño. Cuando eliminas _countdownClock su padre, también debería eliminar la acción y no seguirá disminuyendo el tiempo y debería solucionar tu problema.

Espero que eso ayude.