iOS SpriteKit SKAction 完成调用不起作用/产生奇怪的结果

标签 ios sprite-kit timing 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");
        }];

但是,SKAction 似乎没有按正确的顺序触发。我使用的代码是这样的,一旦完成一个步骤,下一步就会开始。但是,在下一个 SKAction 开始工作之前,SKAction 似乎没有足够快地移动节点。我的印象是使用完成调用意味着下一个 Action 在前一个 Action 完成之前不会开始?这似乎不是这里的情况。此外,如果我为第 1 步(MOVING UP)留了足够长的持续时间,它将跳过第 2 步(MOVING DOWN)并开始执行第 3 步(STARTING MOVEMENT)。我完全不知道这怎么可能。如果有人能指出我在理解如何正确地将不同的 Action 链接在一起时的错误,我将不胜感激。

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

最佳答案

您似乎不了解 runAction 是如何执行的。

使用

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

不仅会定义要在 Action 结束时完成的完成,还会运行 Action 然后调用完成,因此需要删除第一个 [node runAction:moveUp]。

其次,在一个函数/ block 中进行的两个 runAction 调用将同时调用,因为您调用了 [node runAction: moveUp]、[node runAction:moveUp completion:] 和 [node runAction:moveDown completion:]都在同一个 block 中,它们将同时执行。

这是您要查找的代码:

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");
        }];
    }];

关于iOS SpriteKit SKAction 完成调用不起作用/产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20987153/

相关文章:

ios - 你如何以一致的速度移动 IOS SKSprite

ios - 如何让两个相同的 UISwipeGestureRecognizers 根据触摸位置同时工作?

ios - Firebase 获取 child ID swift ios

iphone - 如何读取从 iPhone 中的 sysctlbyname() 检索到的缓冲区数据?

ios - 如何将另一个按钮与右侧导航项 (UIBarButtonItem) 对齐?

swift - SKScene后台播放视频

ios - 在私有(private) cocoapod 中包含本地化的 xib 文件

cudaEvent 和 gettimeofday 报告的时间截然不同

apache - 如何在 Apache 2.0 中以毫秒精度对请求日志进行时间戳

java - java 中的计时操作