以不同的持续时间永远重复动作

Posted

技术标签:

【中文标题】以不同的持续时间永远重复动作【英文标题】:repeat action forever with different durations 【发布时间】:2015-02-17 14:05:09 【问题描述】:

我是 Sprite Kit 的新手,我正在尝试开发一款游戏,其中一些怪物会使用此代码永远四处移动。

    return SKAction.sequence([
        SKAction.runBlock( self.moveMonster(monster) ),
        SKAction.waitForDuration(monster.movementSpeed())
    ])

问题是我希望使用怪物速度来改变等待时间,这是一个功能。

这段代码没有实现我想要做的,因为 movementSpeed 函数只被调用了一次。

非常感谢您的帮助!

【问题讨论】:

如果您希望等待操作对每个序列具有不同的持续时间,则必须在最后使用另一个 runBlock 创建一个新序列 【参考方案1】:

您可以使用runAction中的completionHandler每次添加不同的SKAction sequence来更改您的wait duration。例如。

func addSKAction(waitDuration : NSTimeInterval)

    let moveSprite = SKAction.runBlock( () -> Void in
        self.moveMonster(monster)
    )

    let waitDuration = SKAction.waitForDuration(waitDuration)

    let sequence = SKAction.sequence([moveSprite,waitDuration])

    spriteNode.runAction(sequence, completion:  () -> Void in

        addSKAction(waitDuration) // Change wait duration each time.

    )

每次更改waitDuration变量的值。

如果你只是想随机更改waitDuration,可以使用SKAction.waitForDuration:withRange:

let moveSprite = SKAction.runBlock( () -> Void in
    self.moveMonster(monster)
)

let waitDuration = SKAction.waitForDuration(5, withRange: 4)

let sequence = SKAction.repeatActionForever(SKAction.sequence([moveSprite,waitDuration]))        

这会将waitDuration 从 (5 - range/2) = 3 随机更改为 (5 + range/2) = 7

【讨论】:

非常感谢您的回答。你认为我应该坚持这种方式还是使用更新方法。我还是新手,不确定最佳做法。 这完全取决于你的实现。实际上这两种方法都很好。 我更喜欢那个解决方案,但是我在使用新的 motionSpeeds 获得正确的 waitDuration 时遇到了一些麻烦,它总是不同步,所以我选择了另一个答案【参考方案2】:

在这种情况下我不会使用动作。当计时器需要改变时,我认为使用您的更新方法更有意义。

为你的场景声明两个属性

var monsterTimer: NSTimerInterval(2)
var monsterInterval: NSTimerInterval(2)

在您的更新方法中

self.monsterTimer -= self.delta

if self.monsterTimer <= 0 

    self.moveMonster(monster)

    // change the value of monsterInterval if you need to change the delay
    self.monsterTimer = self.monsterInterval  

【讨论】:

你好,我不确定增量,但我想我明白了整体的想法。我能做的是使用 update 方法的 currentTime 并做:如果(currentTime % SOMEDURATION = 0.0),你怎么看? 不是一个好主意。在此处查看我的答案以获取有关 delta 的更多信息。与上一帧时间(增量)相比,跟踪当前帧的时间很重要。它很有用,因为您可以增加时间、创建流畅的动画等。看看这个:***.com/questions/27696915/…

以上是关于以不同的持续时间永远重复动作的主要内容,如果未能解决你的问题,请参考以下文章

在服务内重复一个动作

显示重复的动作出口

JAVA JDK提供的一个自动生成主键 UUID.randomUUID()的方法 它永远都不会重复嘛??

两个日期之间的持续时间Java [重复]

当精灵到达路径的末尾时,如何从 SpriteKit 重复动作中获取回调?

以不同的时间重复通知