gpt4 book ai didi

ios - Spritekit 多节点动画序列器,可以提高性能吗?

转载 作者:搜寻专家 更新时间:2023-10-31 22:49:42 32 4
gpt4 key购买 nike

我需要能够对在多个节点上运行的一组 SKAction 进行排序,并编写了这个测试。在单个节点上对多个 Action 进行排序很容易,但是没有直接支持在对多个节点进行操作后运行一个序列(例如交换两个节点位置然后闪烁一些其他节点然后淡入更多节点)。下面的代码处理排序,但我想知道如果节点数量太大,每次 update 扫描所有节点是否会花费太多时间。

class AnimatorSequence
{
var animatorStack = [Animator]()
var currentAnimator : Animator!

func startAnimator()
{
currentAnimator = animatorStack.removeAtIndex(0)
currentAnimator.execute()
}

func addAnimator( animator : Animator )
{
animatorStack.append(animator)
if currentAnimator==nil && animatorStack.count == 1
{
startAnimator();
}
}

func process()
{
if let anim = currentAnimator
{
if anim.isDone()
{
currentAnimator = nil
if animatorStack.count > 0
{
startAnimator();
}
}
}
}
}

let animatorSequencer = AnimatorSequence()

class Animator
{
typealias functionType = (() -> Void)?
var function : functionType
var parentNode : SKNode

init (function:functionType, parent : SKNode)
{
self.function = function
self.parentNode = parent
}

func execute()
{
if let f = function
{
f()
}
}

func isDone() -> Bool
{
var count = parentNode.children.count
for node in parentNode.children
{
if !node.hasActions()
{
count--;
}
}
return count==0;
}
}

调用示例:

    let a = Animator(function: { () -> Void in

firstDot.node.runAction(moveToSecond)
secondDot.node.runAction(moveToFirst)

}
, parent : self
)

animatorSequencer.addAnimator(a)

和每次更新

override func update(currentTime: CFTimeInterval)
{
animatorSequencer.process()
}

这样做的目的是让我可以轻松地对多个多节点动画进行排序,只需一个闭包即可,而且不需要任何复杂的东西。它似乎有效,但我想知道是否有更高效的方法来确定是否所有 SKAction 都已完成。

最佳答案

我实际上写了一个类来做你正在寻找的东西。它本质上是一个接一个被调用的 SKAction 队列。您添加到队列中的任何内容都将按顺序处理,因此您不必再担心回调例程。您可以添加来自多个不同 SKSpriteNode 的 Action ,而无需创建 Action 序列。

https://github.com/evannnc/ActionQ

关于ios - Spritekit 多节点动画序列器,可以提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31393854/

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