【问题标题】:Modify a repeating task sequence while running在运行时修改重复的任务序列
【发布时间】:2014-12-29 22:23:51
【问题描述】:

我正在尝试做一个重复任务,我可以在其中更改它重复的延迟。这是我正在使用的当前代码:

 var actionwait = SKAction.waitForDuration(self.wait)
        var actionrun = SKAction.runBlock({
            self.count+=1
            if (self.count % 2 == 0 && self.wait > 0.2){

                self.wait -= 0.1
                 actionwait.duration = self.wait
            }
            for node in self.children{
                if (node.isMemberOfClass(Dot)){
                    node.removeFromParent()
                }
            }
            var radius = CGFloat(arc4random_uniform(100) + 30)
            var newNode = Dot(circleOfRadius: radius)
            var color = self.getRandomColor()
            newNode.fillColor = color
            newNode.strokeColor = color
            newNode.yScale = 1.0
            newNode.xScale = 2.0
            newNode.userInteractionEnabled = true
            newNode.setScene(self)
            newNode.position = newNode.randomPos(self.view!)
            self.addChild(newNode)

            })

        self.runAction(SKAction.repeatActionForever(SKAction.sequence([actionwait,actionrun])))

但是,由于该序列已经在重复,因此更改延迟的持续时间似乎不会产生任何影响。

【问题讨论】:

    标签: ios swift sprite-kit skaction


    【解决方案1】:

    当您创建 actionwait 时,它将保存该闭包中的值并继续在您的 repeatActionForever 中使用它们

    当您跟踪更改时,最好在 update 方法中执行此类操作。在这种情况下使用操作可能不是最好的方法。

    我不确定您(对于您的游戏)何时需要检查更改。对于大多数事情,使用update 方法就足够了

    这是我在更新中实现计时器的一种方法

    // MY TIMER PROPERTIES IN MY CLASS
    var missleTimer:NSTimeInterval = NSTimeInterval(2)
    var missleInterval:NSTimeInterval = NSTimeInterval(2)
    
    
    // IN MY UPDATE METHOD
    self.missleTimer -= self.delta
    
    if self.missleTimer <= 0 {  // TIMER HIT ZERO, DO SOMETHING!
        self.launchMissle()  // LAUNCH MY MISSLE
        self.missleTimer = self.missleInterval  // OKAY LETS RESET THE TIMER
    }
    

    delta 是这一帧和最后一帧之间的时间差。它用于创建流畅的运动和跟踪时间。像这样的东西。这在 spritekit 项目中是相当标准的。您通常需要在项目范围内使用 delta

    声明这两个属性:

    // time values
    var delta:NSTimeInterval = NSTimeInterval(0)
    var last_update_time:NSTimeInterval = NSTimeInterval(0)
    

    这应该是你的更新方法顶部的样子

    func update(currentTime: NSTimeInterval) {
        if self.last_update_time == 0.0 
            self.delta = 0
        } else {
            self.delta = currentTime - self.last_update_time
        }
    
        self.last_update_time = currentTime
    

    【讨论】:

    • 它会在每一帧渲染之前更新,那么它是否可以准确判断 FPS 可以改变的时间?我不确定如何使用 update 方法创建计时器。我是否必须制作一个计数器并在每帧渲染中添加 1 直到达到某个数字?
    • 什么是self.delta
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多