我非常了解SKAction API,但在多个节点上运行顺序代码时,我无法获得良好的代码。
以下是示例代码(简化):
std::vector<int>* v = new std::vector<int>
前面的代码将完美运行,但是如果我们添加node3,node4将导致样板代码...我希望能够重构它以便更容易阅读和维护给定的规范。类似的东西:
import SpriteKit
class GameScene: SKScene {
weak var node1: SKNode!
weak var node2: SKNode!
override func didMove(to view: SKView) {
super.didMove(to: view)
cacheUI()
runSampleSequence()
}
private func cacheUI() {
// Fetch nodes from associated SKS file
node1 = self.childNode(withName: "node1")!
node2 = self.childNode(withName: "node2")!
}
private func runSampleSequence() {
// I want node1 to fadeIn
// then node2 to fadeIn
// then node1 to fadeOut
// then node2 to fadeOut
node1.run(SKAction.sequence([
SKAction.fadeIn(withDuration: 1),
SKaction.run { [weak self] in
self.node2.run(SKAction.fadeIn(withDuration: 2))
},
SKAction.fadeOut(withDuration: 4),
SKaction.run { [weak self] in
self.node2.run(SKAction.fadeOut(withDuration: 3))
}
]))
}
}
我能实现吗?我希望业务代码尽可能清晰。
SKAction.sequence(_ :)在使用SKAction.run {_}时的行为如何,下一步操作是否保证在最后一个SKAction.run块指令执行后运行(如果是本身执行异步调用)?
奖金问题:我是否有权在关闭捕获列表中将自己设置为弱?因为我不想在解雇游戏场景时将其作为强有力的参考。
编辑: 那么,类似的东西可以完成这项工作,但第二次淡化开始于第一次结束之前......
// Does not compile
self.run(SKAction.sequence([
node1.fadeIn(withDuration: 1),
node2.fadeIn(withDuration: 2),
node1.fadeOut(withDuration: 4),
node2.fadeOut(withDuration: 3)
]))
从SKNode扩展程序返回操作:
private func runSampleSequence() {
// I want node1 to fadeIn
// then node2 to fadeIn
// then node1 to fadeOut
// then node2 to fadeOut
self.run(SKAction.sequence([
node1.fadeIn(withDuration: 1),
node2.fadeIn(withDuration: 2),
node1.fadeOut(withDuration: 4),
node2.fadeOut(withDuration: 3)
]))
}
答案 0 :(得分:0)
我能实现吗?我希望业务代码显得清晰 可能的。
您可以使用swift扩展来使您的代码更具可读性。例如:
extension SKNode {
//TODO: Rename method and variable to be more expressive
func runAnimationName(node2:SKNode) {
self.run(SKAction.sequence([
SKAction.fadeIn(withDuration: 1),
SKAction.run {
node2.run(SKAction.fadeIn(withDuration: 2))
},
SKAction.fadeOut(withDuration: 4),
SKAction.run {
node2.run(SKAction.fadeOut(withDuration: 3))
}
]))
}
}
使用SKAction.run时,SKAction.sequence(_ :)的行为如何? {_},下一步操作是否保证在最后一次之后运行 执行SKAction.run块的指令(如果它本身就会执行 执行异步调用)?
是的,行动是按顺序执行的。此外,如果SKAction
运行块内存在异步调用,则下一个SKAction
将不会等待该异步调用结束。
奖金问题:我在关闭捕获时将自己设置为弱是正确的 清单?因为我不希望它作为一个强有力的参考 解雇游戏场景。
您没有在块中使用self
,因此您可以移除[weak self]
。
答案 1 :(得分:0)
好吧,一个解决方案是将每个SKAction.run {_}部分与具有相同持续时间的SKAction.wait(_ :)组合在一起(这很难看,序列调用应该自己处理它):
extension SKNode {
func fadeIn(withDuration: TimeInterval) -> SKAction {
let action = SKAction.group([
SKAction.wait(forDuration: withDuration),
SKAction.run {
self.run(SKAction.fadeIn(withDuration: withDuration))
}
])
return action
}
//TODO: Extend for each base SKAction ...
}