首页 > 解决方案 > 为什么对随机函数的调用不能按顺序工作?

问题描述

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

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

标签: swiftsprite-kit

解决方案


不要永远重复,而是使用完成块来建立一个新的 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% 正确的


推荐阅读