【问题标题】:Run two SKActions in sequence without SKAction.Sequence (make sure one finishes, wait then run the other)在没有 SKAction.Sequence 的情况下按顺序运行两个 SKAction(确保一个完成,等待然后运行另一个)
【发布时间】:2019-08-29 17:18:00
【问题描述】:

我正在尝试创建 2 个函数。一个沿 y 轴(向上)移动精灵(汽车),一个旋转它(向左或向右旋转 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 中,我希望能够以我想要的任何顺序调用操作。例如调用(向前,向右旋转,向前,向左旋转),但是当我运行代码时,动作是无序的(或者有时如果我向前移动两次,总是会忽略一个)。我认为这是因为运行操作是异步执行的,因此一些操作在另一个完成之前开始运行。我知道动作序列在这里很有帮助,但这是一个面向初学者的函数教程,我需要能够从 ViewController 中单独调用每个函数。我尝试使用 DispatchGroup() 但它要么阻塞主线程,要么让它们乱序运行(我可能使用错了)。非常感谢任何帮助!

【问题讨论】:

    标签: ios swift asynchronous sprite-kit grand-central-dispatch


    【解决方案1】:

    创建在前一个动作完成时触发的动作数组。

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

    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()
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2014-04-30
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多