我做了一些研究,我似乎无法找到任何清楚解释如何在动画中预加载单个纹理和纹理的东西。我目前正在Atlas
中使用Assets.xcassets
来对相关的动画图像进行分组。在Atlas中显示我的图像是否意味着它们是预装的?就单个图像而言,在GameScene
之前声明纹理是否有意义:let laserImage = SKTexture(imageNamed: "Sprites/laser.jpg")
然后(例如)在我的一个SKSpriteNode子类中我可以通过laserImage
通过?
我最终想知道是否有明确定义的方法,或者我是否应该在GameScene
之前将每个纹理存储为常量。任何有关正确(和最有效)的方法的建议都会很棒。
答案 0 :(得分:11)
我尝试实现appzYourLife的答案,但它增加了加载每个纹理的时间。所以我最终将所有最常用的Sprites放在一张单独的地图集中并将其放入一个单独的地图中。
class Assets {
static let sharedInstance = Assets()
let sprites = SKTextureAtlas(named: "Sprites")
func preloadAssets() {
sprites.preloadWithCompletionHandler {
print("Sprites preloaded")
}
}
}
我在menuScene中调用Assets.sharedInstance.preloadAssets()
。而且:
let bg1Texture = Assets.sharedInstance.sprites.textureNamed("background1")
bg1 = SKSpriteNode(texture: bg1Texture)
引用已加载到内存中的纹理。
答案 1 :(得分:6)
将您的所有资产放入一个Sprite Atlas中。如果它们不合适,请至少尝试将单个场景的所有资源放入单个Sprite Atlas
如果您愿意,可以使用此代码预加载内存中的纹理图集
SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler {
// Now everything you put into the texture atlas has been loaded in memory
}
您不需要保存对纹理图集的引用,SpriteKit有一个内部缓存系统。让它做它的工作。
忘记文件图像的名称,将图像分配给资产目录的名称是您需要的唯一名称。
let texture = SKTextureAtlas(named:"croc").textureNamed("croc_walk01")
let croc = SKSpriteNode(texture: texture)