¿Cómo hacer que un SKLabelNode ejecute una SKAction waitForDuration para actualizar después de realizar una acción?

StackOverflow https://stackoverflow.com//questions/22051089

Pregunta

Estoy intentando tener una rueda de colores que actualice SKLabelNode al color que se selecciona después de girar la rueda.SKLabelNode se actualiza justo cuando el usuario hace clic en la rueda, y he intentado colocar un SKAction waitForDuration en un par de lugares diferentes, pero nada hace que SKLabelNode espere hasta que la rueda termine de girar.

#import "MyScene.h"

@interface MyScene ()

@property (strong, nonatomic) SKSpriteNode *wheel;
@property (strong, nonatomic) SKLabelNode *colorSelected;
@property (strong, nonatomic) SKLabelNode *colorIndicator;

@end

@implementation MyScene
{
BOOL *_wheelSpun;
NSMutableArray *_colorNumberArray;
NSMutableArray *_durationNumberArray;
int randomSpinNumber;
}

-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    _wheel = [SKSpriteNode spriteNodeWithImageNamed:@"colorWheel"];
    _wheel.position = CGPointMake(self.size.width/2, self.size.height/2 + 70);
    _wheel.xScale = .5;
    _wheel.yScale = .5;
    _wheel.name = @"wheel";

    [self addChild:_wheel];

    _colorSelected = [SKLabelNode labelNodeWithFontNamed:@"Apple Chancery"];
    _colorSelected.text = @"Click the wheel to spin the colors!";
    _colorSelected.position = CGPointMake(self.size.width/2, self.size.height/2 - 60);
    _colorSelected.fontColor = [SKColor whiteColor];
    _colorSelected.fontSize = 16;

    [self addChild:_colorSelected];

    _colorIndicator = [SKLabelNode labelNodeWithFontNamed:@"Apple Color Emoji"];
    _colorIndicator.text = @"⬇";
    _colorIndicator.position = CGPointMake(self.size.width/2, self.size.height/2 + 175);
    _colorIndicator.fontSize = 16;

    [self addChild:_colorIndicator];

    _wheelSpun = NO;

    randomSpinNumber = arc4random()%4;
    NSLog(@"%i spun", randomSpinNumber);
}
return self;
}

-(void)colorTextUpdate
{
SKAction *wait = [SKAction waitForDuration:5.2];
[self runAction:wait];

if (randomSpinNumber == 0) {
    _colorSelected.text = @"Blue Color Spun";
}

if (randomSpinNumber == 1) {
    _colorSelected.text = @"Orange Color Spun";
}

if (randomSpinNumber == 2) {
    _colorSelected.text = @"Yellow Color Spun";
}

if (randomSpinNumber == 3) {
    SKAction *wait = [SKAction waitForDuration:5.1];
    [self.colorSelected runAction:wait];
    _colorSelected.text = @"Red Color Spun";
}
}

-(void)wheelSpin
{

_wheelSpun = YES;

if (randomSpinNumber == 0)
{
    SKAction *rotateWheel1 = [SKAction rotateByAngle:350 duration:5];
    [self.wheel runAction:rotateWheel1];
    [self colorTextUpdate];
}

if (randomSpinNumber == 1) {
    SKAction *rotateWheel2 = [SKAction rotateByAngle:204 duration:5];
    [self.wheel runAction:rotateWheel2];
    [self colorTextUpdate];
}

if (randomSpinNumber == 2) {
    SKAction *rotateWheel3 = [SKAction rotateByAngle:108 duration:5];
    [self.wheel runAction:rotateWheel3];
    [self colorTextUpdate];
}

if (randomSpinNumber == 3) {
    SKAction *rotateWheel4 = [SKAction rotateByAngle:420 duration:5];
    [self.wheel runAction:rotateWheel4];
    [self colorTextUpdate];
}
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */

UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self];

SKNode *node = [self nodeAtPoint:touchLocation];
if ([node.name isEqualToString:@"wheel"]  && !_wheelSpun) {
    [self wheelSpin];

}
}

@end
¿Fue útil?

Solución

Parece que estás llamando a la acción de rotación y al cambio de color simultáneamente; solo porque estas dos líneas de código se colocan y ejecutan una tras otra, no significa que la segunda esperará hasta que termine la primera.

Intente actualizar el color en un bloque de finalización; esto garantizará que se llame después de finalizar la rotación:

[self.wheel runAction:rotateWheel1 completion:^{
    [self colorTextUpdate];
}];

Esto también hace que la acción de espera en su SKLabelNode superfluo, puedes eliminarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top