为什么对随机函数的调用在序列中不起作用?

时间:2019-08-24 21:44:49

标签: swift sprite-kit

我试图为一个简单的对象生成一个随机的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)))

圆圈仅移动一次到一个位置,此后似乎再也没有移动过。我怀疑它只是一遍又一遍地移到同一位置。感谢您的任何建议!

2 个答案:

答案 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%正确