【问题标题】:How can I create a loop that runs two functions, never overlapping?如何创建一个运行两个函数且永不重叠的循环?
【发布时间】:2015-07-15 23:24:33
【问题描述】:

我是编程新手,一直在学习有关 swift 和 spritekit 的在线课程,试图从头开始创建我的第一个工作游戏。

目前我在尝试创建一系列独立运行的函数时遇到问题,等待一次只有一个运行,然后无限循环。

第一个函数:

func shootTwentyArrows() {

    var oneArrow = SKAction.runBlock{

        self.shootArrow()

    }

    var waitBetweenArrows = SKAction.waitForDuration(arrowSpeed)
    var fireAnArrow = SKAction.sequence([oneArrow, waitBetweenArrows])
    self.runAction(SKAction.repeatAction(fireAnArrow, count: 20))
}

还有第二个功能:

func shootSpiral1() {

    var leftArrow = SKAction.runBlock{

        self.arrowFromLeft()

    }

    var rightArrow = SKAction.runBlock{

        self.arrowFromRight()

    }

    var waitBetweenArrows = SKAction.waitForDuration(arrowSpeed)
    var sequence = SKAction.sequence([leftArrow, waitBetweenArrows, rightArrow, waitBetweenArrows])

    var spiral1 = SKAction.repeatAction(sequence, count: 5)

    self.runAction(spiral1)

为了澄清,我正在尝试运行类似: 射击二十箭() 完成后,shootSpiral1(),完成后重复。

提前感谢您的任何回复。

【问题讨论】:

  • 当函数实际完成或内部创建的动作完成时,您是否将其视为已完成?
  • 函数中的动作完成时

标签: swift function sprite-kit skaction


【解决方案1】:

我想最正确的方法是稍微重构代码:

func shootTwentyArrows() -> SKAction {

let oneArrow = SKAction.runBlock{

    self.shootArrow()

}

let waitBetweenArrows = SKAction.waitForDuration(arrowSpeed)
let fireAnArrow = SKAction.sequence([oneArrow, waitBetweenArrows])
return SKAction.repeatAction(fireAnArrow, count: 20)
}

func shootSpiral1() -> SKAction {

let leftArrow = SKAction.runBlock{

    self.arrowFromLeft()

}

let rightArrow = SKAction.runBlock{

    self.arrowFromRight()

}

let waitBetweenArrows = SKAction.waitForDuration(arrowSpeed)
let sequence = SKAction.sequence([leftArrow, waitBetweenArrows, rightArrow, waitBetweenArrows])

let spiral1 = SKAction.repeatAction(sequence, count: 5)
return spiral1
}

然后你可以在代码中的某个地方做这样的事情:

let spiralAction = shootSpiral1()
let oneArrowAction = shootTwentyArrows()
let sequence = SKAction.sequence([spiralAction, oneArrowAction])
let infiniteSequence = SKAction.repeatActionForever(sequence)
self.runAction(infiniteSequence)

我故意让函数名称保持不变,所以你明白了。

P.S. 将变量声明为let 是一种常见的做法,只有在以后需要修改时才将其声明为var。

【讨论】:

  • 感谢您的回复!我还没有尝试过(我会暂时尝试),但我想知道你是否可以向我解释一下这段代码会使序列不会同时运行这两个函数?
  • @Casey,如果这对您有用,您应该将答案标记为正确(左侧的勾号):)
【解决方案2】:

最好的方法是使用一个 SKAction 序列来调用你的两个函数。你可以从任何你想初始化射箭动作的地方调用这个 SKAction,比如viewDidLoad。这将是调用操作的代码...

var actionShootingArrows = SKAction.sequence([shootSpiral1(), shootTwentyArrows()])
self.runAction(SKAction.repeatActionForever(actionShootingArrows))

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2015-08-08
    • 2022-01-04
    • 2014-04-16
    • 2018-10-28
    相关资源
    最近更新 更多