iOS SpriteKit SKAction完成调用无法工作/创建奇怪的结果

Mar*_*ero 2 timing ios sprite-kit skaction

我正试图通过命令将SKNode移动到屏幕上.我已经设置了以下SKAction链,以便1)节点向上和向外移动,然后2)节点向下移动到起始位置,然后3)开始移动.我已经使用以下代码来尝试实现这个:

    SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0];
    SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed];

    [self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) {
        NSLog(@"RUNNING MOVE UP");
        [node runAction: moveUp];

        [node runAction:moveUp completion:^{
            NSLog(@"RUNNING MOVE DOWN");
            [node setHidden: NO];
            [node runAction: moveDown];
        }];

        [node runAction:moveDown completion:^{

            NSLog(@"STARTING MOVEMENT");
        }];
Run Code Online (Sandbox Code Playgroud)

但是,SKActions似乎没有以正确的顺序触发.我使用了代码,这样一旦完成一步,下一步就会开始.但是,在下一次SKAction开始工作之前,SKAction似乎没有足够快地移动节点.我的印象是,使用完成调用意味着下一个操作在上一个操作完成之前不会启动?这似乎不是这种情况.另外,如果我为步骤1(向上移动)留下足够长的持续时间,它将跳过步骤2(向下移动)并开始执行步骤3(开始移动).我完全不知道这是怎么回事.如果有人能够指出我在理解如何正确地将不同的行为联系在一起的错误,我将不胜感激.

(我没有做SKAction序列,因为我必须在中途"取消隐藏"节点.我不认为我可以把它放在一个序列中,除非我也错了.)

ASK*_*ASK 10

您似乎并不了解runAction的执行方式.

运用

    [node runAction:moveUp completion:^{
        NSLog(@"RUNNING MOVE DOWN");
        [node setHidden: NO];
        [node runAction: moveDown];
    }];
Run Code Online (Sandbox Code Playgroud)

将不仅定义在操作结束时完成的完成,而是运行操作然后调用完成,因此需要删除第一个[node runAction:moveUp].

其次,将同时调用在一个函数/块中进行的两个runAction调用,并且因为您调用[node runAction:moveUp],[node runAction:moveUp completion:]和[node runAction:moveDown completion:] all in the相同的块,它们都将同时执行.

这是您要查找的代码:

SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0];
SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed];

[self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) {
    NSLog(@"RUNNING MOVE UP");

    [node runAction:moveUp completion:^{
        NSLog(@"RUNNING MOVE DOWN");
        [node setHidden: NO];
        [node runAction:moveDown completion:^{

            NSLog(@"STARTING MOVEMENT");
        }];
    }];
Run Code Online (Sandbox Code Playgroud)