gpt4 book ai didi

ios - 在没有 SKAction.Sequence 的情况下按顺序运行两个 SKActions(确保一个完成,等待然后运行另一个)

转载 作者:行者123 更新时间:2023-11-28 05:38:42 24 4
gpt4 key购买 nike

我正在尝试创建 2 个函数。一种沿 y 轴(向上)移动 Sprite (汽车),另一种将其旋转(向左或向右 90 度)。我创建了两个函数(moveCarForward()rotateCar(angle)),它们具有几乎相同的代码,但内部的操作不同。

let waitAction = SKAction.wait(forDuration: 1)
let rotateAction = SKAction.rotate(byAngle: angle, duration: 1)
let doneAction = SKAction.run({ [weak self] in
car?.removeAction(forKey: "carRotating")
})
let moveActionWithDone = SKAction.sequence([waitAction, rotateAction, doneAction])
self.car!.run(moveActionWithDone, withKey: "carRotating")

现在我的问题是,在我的 GameViewController 中,我希望能够以我想要的任何顺序调用操作。例如调用(向前,向右旋转,向前,向左旋转)但是当我运行代码时,操作是乱序的(或者有时如果我向前移动两次,一个总是被忽略)。我认为这是因为运行操作是异步执行的,所以一些操作在另一个操作完成之前开始运行。我知道 Action Sequence 在这里很有用,但这是一个面向初学者的函数教程,我需要能够从 ViewController 单独调用每个函数。我尝试使用 DispatchGroup(),但它要么阻塞主线程,要么让它们乱序运行(我可能用错了)。非常感谢任何帮助!

最佳答案

创建一个 Action 数组,在上一个 Action 完成时触发。

在我的示例中,我使用自定义操作来执行此操作。

var car = SKSpriteNode(imageNamed:"car")
var actionChain = [SKAction]()
var completionAction = SKAction.customAction(withDuration:0){
[node, elapsedTime] in
if self.actionChain.count == 0 || elapsedTime > 0 {return}
let action = self.actionChain.removeFirst()
node.run(SKAction.sequence([action, self.completionAction]))
}

func moveCarForward(){

actionChain.append(SKAction.moveBy(x:10,y:0, duration:1))
}
func rotateCar(){

actionChain.append(SKAction.rotate(byAngle:.pi, duration:1))
}

func driveCar(){
car.run(completionAction)
}

func testPath(){
moveCarForward()
rotateCar()
rotateCar()
moveCarForward()
driveCar()

}

关于ios - 在没有 SKAction.Sequence 的情况下按顺序运行两个 SKActions(确保一个完成,等待然后运行另一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com