我试图为一个简单的对象生成一个随机的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)))
圆圈仅移动一次到一个位置,此后似乎再也没有移动过。我怀疑它只是一遍又一遍地移到同一位置。感谢您的任何建议!
答案 0 :(得分:0)
好的,经过多次努力,以下工作正常:
let customAction = SKAction.customAction(withDuration: 1000)
{
circle, _ in
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))
}
circle.run(customAction)
戴在暗示匿名功能方面是正确的。 SKAction方法customAction允许这样做。然后在函数内部运行实际动作,以确保每次动作都是随机的。非常感谢!
答案 1 :(得分:0)
而不是永远重复,而是使用完成块来建立新的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%正确