gpt4 book ai didi

Swift/SpriteKit - 有什么方法可以池化/缓存 SKReferenceNodes 吗?

转载 作者:搜寻专家 更新时间:2023-11-01 07:22:18 25 4
gpt4 key购买 nike

有没有办法使用 Swift 在 SpriteKit 中池化/缓存 SKReferenceNodes?

我正在使用 xCodes 可视化关卡编辑器创建游戏。我正在使用可视化关卡编辑器创建不同的 .sks 文件,而不是在需要时调用代码。我在代码中调用它们是因为我使用它们来创建随机关卡或障碍物,所以我不需要将它们全部添加到场景中。

目前我是这样做的

我为 SKReferenceNodes 创建了一个说服 init 方法,以使用 URL 初始化它们。我这样做是因为存在某种直接通过文件名调用 SKReferenceNodes 的错误(https://forums.developer.apple.com/thread/44090)。使用这样的扩展使得代码更简洁。

 extension SKReferenceNode {

convenience init(roomName: String) {
let path: String
if let validPath = NSBundle.mainBundle().pathForResource(roomName, ofType: "sks") {
path = validPath
} else {
path = NSBundle.mainBundle().pathForResource("RoomTemplate", ofType: "sks")! // use empty roomTemplate as backup so force unwrap
}

self.init(URL: NSURL(fileURLWithPath: path))
}

而且在我的场景中我可以创建它们并像这样添加它们(大约每 10 秒)

 let room = SKReferenceNode(roomName: "Room1") // will cause lag without GCD
room.position = ...
addChild(room)

这工作正常,但我在创建这些时遇到了一些滞后/卡顿。所以我正在使用 GCD 将其减少到基本上没有口吃。它运行良好,但我想知道我是否可以先预加载所有 .sks 文件。

我尝试使用数组来执行此操作,但我遇到了崩溃,而且它似乎不起作用(我还收到一条消息,已经添加了具有父节点的节点)。

我试图在应用程序启动时像这样预加载它们

 let allRooms = [SKReferenceNode]()

for i in 0...3 {
let room = SKReferenceNode(roomName: "Room\(i)")
allRooms.append(room)
}

然后在我需要时使用数组。但是,这不起作用,尝试使用这样的代码时我遇到了崩溃

 let room = allRooms[0]
room.position =
addChild(room) // causes error/crash -> node already has parent

有人做过类似的事情吗?还有另一种方法可以汇集/缓存这些引用节点吗?我在这里遗漏了什么吗?

最佳答案

谈到 SKReferenceNode预加载,我认为要遵循的策略是加载你的对象,找到它们的类型并使用 Sprite-Kit 中可用的官方预加载方法:

为避免此类错误,您应该创建单独的节点实例。

尝试这样做:

let room = allRooms[0]
room.position = ...
room.removeFromParent()
addChild(room)

关于Swift/SpriteKit - 有什么方法可以池化/缓存 SKReferenceNodes 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38183466/

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