Swift:在随机时间间隔之后重复执行操作。

4
以前,我可以使用Objective-C中的performSelector:方法在随机时间(1-3秒之间)后重复执行某个操作。但是由于Swift无法使用performSelector:方法,我尝试使用“NSTimer.scheduledTimerWithTimeInterval”方法来实现重复执行该操作的效果。虽然这种方法有效,但是存在一个问题:我设置了一个时间变量来调用一个生成随机数的函数,但是NSTimer似乎每次重复执行操作时都使用相同的数字。
这意味着该操作并不是随机执行的,而是按照在游戏开始时生成的一定时间间隔执行的。我的问题是:有没有办法让NSTimer每次执行该操作时都生成一个新的随机数?或者我应该使用其他方法?谢谢!

可能是 [Swift performSelector: withObject: afterDelay:] 的重复问题 (https://dev59.com/tmAf5IYBdhLWcg3w52A_)。 - Jack
如果您在计时器运行后调用选择器中重新创建计时器,会发生什么? - holex
1
在Sprite Kit或Cocos2d中,使用skactions或update:来代替nstimer、gcd dispatch或performselector。详情请参见此处:https://dev59.com/bmAg5IYBdhLWcg3wG3wK#23978854。 - CodeSmile
@LearnCocos2D,你能帮我把这段代码翻译成Swift吗?谢谢! - José María
我迄今为止还没有接触过Swift... - CodeSmile
@LearnCocos2D 哦... :( - José María
3个回答

5

@LearnCocos2D是正确的...在你的场景中使用SKActionsupdate方法。这里有一个基本的示例,展示如何使用update在随机时间后重复执行一项操作。

class YourScene:SKScene {

    // Time of last update(currentTime:) call
    var lastUpdateTime = NSTimeInterval(0)

    // Seconds elapsed since last action
    var timeSinceLastAction = NSTimeInterval(0)

    // Seconds before performing next action. Choose a default value
    var timeUntilNextAction = NSTimeInterval(4)

    override func update(currentTime: NSTimeInterval) {

        let delta = currentTime - lastUpdateTime
        lastUpdateTime = currentTime

        timeSinceLastAction += delta

        if timeSinceLastAction >= timeUntilNextAction {

            // perform your action

            // reset
            timeSinceLastAction = NSTimeInterval(0)
            // Randomize seconds until next action
            timeUntilNextAction = CDouble(arc4random_uniform(6))

        }

    }

}

调用self.update方法时,我应该传递什么参数?感谢您的回答! - José María
另外,我该如何延迟操作?我的意思是,如果我使用这个,操作会在场景加载时立即执行。那么,我该如何延迟更新,比如在场景加载后10秒钟再执行呢?谢谢! - José María
你永远不会直接调用update方法。这张图片将会展示场景动作被评估的顺序: https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013043-CH1-SW1 - Jon
这里的概述部分也会有所帮助:https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html - Jon
哦,有趣。我得调查一下。谢谢你的信息和帮助! - José María
显示剩余2条评论

3

在你的代码中使用let wait = SKAction.waitForDuration(sec, withRange: dur)。带有withRange参数的SKAction.waitForDuration将计算平均时间为sec,可能范围为dur的随机时间间隔。


0

自己生成一个随机时间,然后使用dispatch_after执行操作。

有关dispatch_after的更多信息,请参见此处。基本上,您可以使用它来替代performSelector


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接