gpt4 book ai didi

ios - 如何使用 - swift - SpriteKit 编写将在特定时间运行函数的协议(protocol)

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

是否可以创建这样的协议(protocol):

protocol SetupProt {
func setup()
}

然后在我的 didMove 函数结束时,告诉应用程序运行所有实现此协议(protocol)的子类的所有设置函数?

或者我是否需要存储对实现协议(protocol)的所有这些对象的引用并遍历它们?

目前我正在使用该协议(protocol)。

然后我有一个像这样的全局数组:

setups = [SetupProt] = []

我的游戏中有“平台”的子类。我在 XCODE 编辑器中对其进行子类化。在 aDecoder init 函数中,我将该节点添加到这个全局数组中...

我这样做是因为此时场景属性为 nil,所以我还不能访问它,我猜它还没有完成加载。

在我的场景 didMove 结束时,我遍历了这个数组:

for set in setups { set.setup() }

这就完成了工作。

我想知道是否可以不存储所有这些对象的数组,而是只告诉应用程序:“嘿,为实现此协议(protocol)的任何对象运行设置函数。

最佳答案

您在 GameplayKit 中执行此操作,因此您要做的是遍历您的组件

entities.foreach{
($0.components.filter({$0 as? SetupProtocol != nil}) as? [SetupProtocol]).foreach{
$0.setup()
}
}

这将避免必须将通知监听器附加到使用此协议(protocol)的每个项目。设置通常是一次性完成的类型交易,因此让您的实例“监听”仅发送一次的消息最终可能会浪费资源。

gameplay kit 的优点在于,从技术上讲,您甚至不需要协议(protocol),您可以拥有一个专为设置而设计的组件,然后我们就可以避免不必要的过滤、转换和循环。

entities.foreach{$0.component(ofType:SetupComponent).setup()}

--SetupComponent内部

class SetupComponent : GKComponent
{
func setup()
{
guard let entity = entity as? SetupProtocol else {return}
entity.setup()
}
}

然后您可以更进一步,为所有组件创建“存储桶”。这将帮助您更好地管理事情。

let setupBucket =  entities.flatmap{$0.components.filter({$0 as? SetupProtocol != nil})} as? [SetupProtocol]. //I may need to verify this syntax is correct when I get home, doing it from memory.

您可以添加设置桶、更新桶等内容,所有这些都是每种类型组件的数组。这样,如果您需要在给定组件类型的所有实体上调用方法,您就有了可以运行的存储桶。当然,您将必须正确管理存储桶,并确保在将组件附加到实体或从实体移除组件时添加/删除。

现在我似乎回想起在 iOS 10 中遇到的组件问题,我不得不创建子组件类,因为子类化无法正常工作,但我不知道它在 iOS 11 中的状态。我可以告诉你Scenekit 构建器组件在 XCode 9 中被破坏了,所以如果可以的话我会暂时避免使用它(你在 Sprite Kit 上,我不知道他们是否也在 Sprite Kit 上破坏了它)

关于ios - 如何使用 - swift - SpriteKit 编写将在特定时间运行函数的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46622606/

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