【问题标题】:SKScene runAction completion block not called未调用 SKScene runAction 完成块
【发布时间】:2015-09-08 00:11:28
【问题描述】:

我正在开发一个精灵套件游戏,其中我有一个名为 playCountdown 的动作:

SKAction *playCountdown = [SKAction performSelector:@selector(startCountdown) onTarget:self];

playCountdown 工作正常,但是当它完成时,完成块永远不会被调用。

[self runAction:playCountdown completion:^{
            NSLog(@"anything goes");
    }];

为了完整性,这里是 startCountdown:

- (void)startCountdown{
    SKLabelNode *countdownLabel = [SKLabelNode labelNodeWithFontNamed:@"Arial"];

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    __block short countdownValue = 3;

    countdownLabel.position = CGPointMake(screenWidth/2, screenHeight/2 - countdownLabel.fontSize/2);
    countdownLabel.zPosition = 100.0;
    countdownLabel.text = [NSString stringWithFormat:@"%d", countdownValue];
    countdownLabel.fontColor = [UIColor blackColor];
    countdownLabel.verticalAlignmentMode = SKLabelVerticalAlignmentModeBaseline;

    [self addChild:countdownLabel];

    SKAction *zoomIn = [SKAction scaleTo:1.5f duration:0.9];
    SKAction *fadeOut = [SKAction fadeAlphaTo:0.0f duration:0.1];
    SKAction *updateCount = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
        SKLabelNode *textNode = (SKLabelNode *)node;
        countdownValue --;
        if (countdownValue == 0) {
            textNode.text = @"PLAY!";
        }
        else{
            textNode.text = [NSString stringWithFormat:@"%d", countdownValue];
        }

        textNode.alpha = 1.0f;
        textNode.xScale = 1.0f;
        textNode.yScale = 1.0f;
    }];

    SKAction *sequence = [SKAction sequence:@[zoomIn, fadeOut, updateCount]];
    SKAction *repeat = [SKAction repeatAction:sequence count:4];
    [countdownLabel runAction:repeat completion:^{
        [countdownLabel removeFromParent];
    }];

    NSLog(@"completed!");
}

我已验证 startCountdown 实际上已结束。然而,完成块永远不会被调用。有什么想法吗?

谢谢

【问题讨论】:

    标签: ios sprite-kit skaction skscene


    【解决方案1】:

    我建议您通过创建一个非常简单的仅 NSLog 块来验证您的代码确实被调用了。

    如果您仍有问题,请考虑改用SKAction sequence。这将完成与您尝试使用完成块所做的相同的事情。

    【讨论】:

    • 永远不会使用选择器操作调用代码。看我的回答。我已经使用您提出的序列解决方案创建了所需的功能。同样,正如我在回答中提到的,系统不知道第一个动作何时结束,我必须插入一个延迟动作来同步第二个动作的开始和第一个动作的结束。谢谢。
    【解决方案2】:

    使用选择器创建的 SKAction 肯定有问题...代码:

    SKAction *playCountdown = [SKAction performSelector:@selector(startCountdown) onTarget:self];
    

    将执行调用:

    [self runAction:playCountdown completion:^{ ... }];
    

    虽然完成块永远不会被调用。

    我使用块创建了 playCountdown 动作:

    SKAction *playCountdown = [SKAction runBlock:^{
            [self startCountdown];
        }];
    

    现在调用完成块。现在的问题是 playCountdown 动作的结束没有被系统“理解”,并且这 2 个动作不是连续运行而是几乎同时运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多