작업이 수행된 후 SKLabelNode가 waitForDuration SKAction을 실행하여 업데이트하도록 하는 방법은 무엇입니까?

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

문제

휠을 회전시킨 후 선택된 색상으로 SKLabelNode를 업데이트하는 색상 휠을 만들려고 합니다.사용자가 휠을 클릭할 때 SKLabelNode가 바로 업데이트되고 있으며 SKAction waitForDuration을 몇 가지 다른 지점에 배치하려고 시도했지만 휠이 회전할 때까지 SKLabelNode가 대기하도록 하는 것은 없습니다.

#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
도움이 되었습니까?

해결책

회전 작업과 색상 변경을 동시에 호출하는 것 같습니다. 이 두 줄의 코드가 차례로 배치되고 실행되기 때문에 첫 번째 코드가 완료될 때까지 두 번째 코드가 대기한다는 의미는 아닙니다.

완료 블록에서 색상을 업데이트해 보세요. 이렇게 하면 회전이 완료된 후 호출됩니다.

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

이는 또한 귀하의 대기 작업을 수행합니다. SKLabelNode 불필요한 - 제거할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top