Random Swift:在一段随机时间后重复动作
以前,对于Objective-C,我可以使用performSelector:在随机时间段(可能在1-3秒之间变化)后重复操作。但由于我不能在Swift中使用performSelector:我尝试使用“NSTimer.scheduledTimerWithTimeInterval”。它的作用是为了重复这个动作。但有一个问题。设置时间变量以调用将生成随机数的函数。但似乎NSTimer每次重复操作时都使用相同的数字 这意味着动作不是随机执行的,而是在游戏开始时随机生成并在整个游戏中使用的一段时间后执行的Random Swift:在一段随机时间后重复动作,random,swift,sprite-kit,nstimer,performselector,Random,Swift,Sprite Kit,Nstimer,Performselector,以前,对于Objective-C,我可以使用performSelector:在随机时间段(可能在1-3秒之间变化)后重复操作。但由于我不能在Swift中使用performSelector:我尝试使用“NSTimer.scheduledTimerWithTimeInterval”。它的作用是为了重复这个动作。但有一个问题。设置时间变量以调用将生成随机数的函数。但似乎NSTimer每次重复操作时都使用相同的数字 这意味着动作不是随机执行的,而是在游戏开始时随机生成并在整个游戏中使用的一段时间后执行的
问题是:有没有办法将NSTimer设置为在每次执行操作时创建一个随机数?或者我应该使用不同的方法?谢谢 自己生成一个随机时间,并使用
dispatch\u after
执行操作
有关
后调度的更多信息,请参阅。基本上,您可以使用它来代替性能选择器
@learncos2D是正确的。。。在场景中使用SKActions
或update
方法。下面是一个使用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))
}
}
}
在代码中使用
let wait=SKAction.waitForDuration(秒,范围:dur)
SKAction.waitForDuration
withwithRange参数将计算随机时间间隔,平均时间=秒,可能的范围=dur如果在计时器运行后调用的选择器中重新创建计时器,则可能会重复whet?请使用skactions或update:,切勿使用nstimer,gcd调度或sprite套件或cocos2d中的performselector,有关详细信息,请参见此处:@learncos2D您能帮我将该代码翻译成Swift吗?非常感谢。到目前为止,我还没有触及swift……调用self.update方法时应该传递什么参数?谢谢你的回答!还有,我如何推迟行动?我的意思是,如果我使用这个,当场景加载时,动作会在开始时执行。我怎样才能延迟更新,比如说在加载场景后10秒?谢谢您永远不会直接调用update方法。此图将向您展示场景动作的评估顺序:这里的概述部分也将提供帮助:还有一个问题。如果我想在游戏后期安排一个动作怎么办?例如,如果我在游戏开始时投了一颗炸弹,那么当用户已经玩了20秒或分数超过15分时,我想要两颗炸弹。我可以用performSelector afterDelay:x来完成。我怎么能在这里这么做?