一次运行两个 SKAction

Posted

技术标签:

【中文标题】一次运行两个 SKAction【英文标题】:Run two SKActions at once 【发布时间】:2013-11-15 18:33:29 【问题描述】:

我正在使用一个序列来运行一个 SKAction 列表。然而,我想做的是运行一个 SKAction,然后一次运行两个,然后依次运行一个。

这是我的代码:

SKNode *ballNode = [self childNodeWithName:@"ball"];

    if (ballNode != Nil)
        ballNode.name = nil;

        SKAction *delay = [SKAction waitForDuration:3];
        SKAction *scale = [SKAction scaleTo:0 duration:1];
        SKAction *fadeOut = [SKAction fadeOutWithDuration:1];
        SKAction *remove = [SKAction removeFromParent];

        //put actions in sequence
        SKAction *moveSequence = [SKAction sequence:@[delay, (run scale and fadeout at the same time), remove]];

        //run action from node (child of SKLabelNode)
        [ballNode runAction:moveSequence];
    

我怎样才能做到这一点?我假设我不能使用序列?

【问题讨论】:

只需为每个应该并行运行的操作调用一次 runAction 你能用代码澄清一下吗?我不太清楚你的意思。 【参考方案1】:

使用组操作。

来自精灵套件编程指南:

组动作是一组动作,一旦组执行,所有动作都开始执行。当您希望操作同步时使用组

SKSpriteNode *wheel = (SKSpriteNode*)[self childNodeWithName:@"wheel"];
CGFloat circumference = wheel.size.height * M_PI;
SKAction *oneRevolution = [SKAction rotateByAngle:-M_PI*2 duration:2.0];
SKAction *moveRight = [SKAction moveByX:circumference y:0 duration:2.0];
SKAction *group = [SKAction group:@[oneRevolution, moveRight]];
[wheel runAction:group];

【讨论】:

值得注意的是,通过为每个操作调用一次 runAction (runAction:oneRevolution .. runAction:moveRight) 可以在没有组的情况下工作。我认为该组主要用于支持在集合(数组、字典)中存储/缓存一组动作,并以编程方式明确其意图是并行执行动作。 +100 这个答案!写的很详细 我只是花了太长时间才弄清楚这一点!谢谢!我想要 SKAction 序列方法,它可以让您按顺序而不是并行运行一组动作(SKAction 组方法)。 组在序列中很有用。 唯一需要注意的是,当您希望两个动作重复多次(或永远)时,两个动作的持续时间应该相同,否则一个动作将在开始之前等待另一个动作完成再次。【参考方案2】:

Swift 中的一个例子是:

    let textLabel = SKLabelNode(text: "Some Text")

    let moveTo = CGPointMake(600, 20)

    let big = SKAction.scaleTo(3.0, duration: 0.1)
    let med = SKAction.scaleTo(1.0, duration: 0.3)
    let reduce = SKAction.scaleTo(0.2, duration: 1.0)
    let move = SKAction.moveTo(moveTo, duration: 1.0)
    let fade = SKAction.fadeOutWithDuration(2.0)
    let removeNode = SKAction.removeFromParent()
    let group = SKAction.group([fade, reduce])

    let sequence = SKAction.sequence([big, med, move, group, removeNode])

    self.addChild(textLabel)
    textLabel.runAction(sequence)

【讨论】:

以上是关于一次运行两个 SKAction的主要内容,如果未能解决你的问题,请参考以下文章

根据 SKLabel 节点文本的字符数运行 SKAction

如何防止在暂停场景上运行 SKAction(取消暂停后),节点纹理在暂停/取消暂停场景后不改变

SKAction 仅在睡眠后或运行调试器时运行

运行SKAction后调用函数

SKAction 中的代码运行操作未执行

在更新动画时运行遵循路径的 SKAction