swift - 为什么对随机函数的调用不能按顺序工作?
问题描述
我试图为一个简单的对象生成一个随机的 X 位置,以便让它在 Swift SpriteKit 游戏的场景中来回反弹。repeatForever 动作应该生成一个随机值,然后将对象(一个圆圈)多次移动到不同的位置,左右。但是,它只起作用一次。就好像正常工作的随机函数只被调用一次,然后该动作只是继续将对象永远移动到同一位置。
let circle = SKSpriteNode(imageNamed: "circle")
circle.run(SKAction.repeatForever(SKAction.move(to:
CGPoint(x: random(min: minCircleX, max: maxCircleX),
y: scene.size.height*0.5),
duration: 0.5)))
圆圈只移动一次,移动到一个位置,之后似乎再也没有移动过。我怀疑它只是一遍又一遍地移动到同一个位置。感谢您的任何建议!
解决方案
不要永远重复,而是使用完成块来建立一个新的 moveTo:
func newLocation(){
let newXLocation: CGPoint = CGPoint(x: random(min: minCircleX, max: maxCircleX),
y: scene.size.height*0.5)
circle.run(SKAction.move(to: newXLocation, duration: 0.5){
[weak self] in self?.newLocation()
}
}
这样做是在完成 moveTo 后,它将添加一个新的 moveTo 和下一个随机位置。唯一的“缺陷”是它将在与当前移动相同的帧内开始下一个移动,因为这是在更新的动作阶段完成的。如果你不想要这个效果,那么你需要将它存储在一个块中,以便在 didFinishUpdate 期间完成
var finishedUpdates = [()->()]()
func newLocation(){
let newXLocation: CGPoint = CGPoint(x: random(min: minCircleX, max: maxCircleX),
y: scene.size.height*0.5)
circle.run(SKAction.move(to: newXLocation, duration: 0.5){
[weak self] in
self?.finishedUpdates.append({weak self] in self?.newLocation()})
}
}
func didFinishUpdate()
{
finishedUpdates.forEach{$0()}
finishedUpdates = [()->()]() //Be sure to clear the array
}
我提前道歉,这只是凭记忆写的,在语法上可能不是 100% 正确的
推荐阅读
- kotlin - 同时具有 dataFetcher 和 typeResolver 的 GraphQL 问题
- vue.js - Keep-alive 不适用于 v-if 和 slot
- c# - 将控件的 ItemsSource 作为值传递给依赖项属性
- windows - Windows - 在 Windows 中使用 for /f 命令选择特定列输出时遇到问题
- c++11 - 具有完美转发的成员函数的 std::bind
- android - 如何防止应用程序在后台被杀死?
- r - R使用先前的迭代值向量化FOR循环
- flutter - 有什么用?之前的运算符。飞镖中的运算符
- c# - 为什么显示 Asp.Net Core 的内置验证错误消息而不是我的 Fluent Validation?
- scala - 生成的播放 json 隐式实例导致 StackOverflowError