stickynugz
stickynugz

Reputation: 41

How to get a SKLabelNode run a waitForDuration SKAction to update after an action is performed?

I am trying to have a color wheel that updates the SKLabelNode to the color that is selected after the wheel is spun. The SKLabelNode is updating right when the user clicks the wheel, and I have tried placing an SKAction waitForDuration in a couple different spots but nothing is having the SKLabelNode wait until after the wheel is done spinning.

#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

Upvotes: 0

Views: 965

Answers (1)

Batalia
Batalia

Reputation: 2425

You seem to be calling the rotation action and the color change simultaneously - just because these two lines of code are placed and executed one after another, it doesn't mean the second one will wait until the first one is finished.

Try updating the color in a completion block - this will ensure that it's called after the rotation is done:

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

This also makes the wait action on your SKLabelNode superfluous - you can remove it.

Upvotes: 2

Related Questions