在SpriteKit中预加载纹理

我已经做了一些研究,我似乎无法find任何明确解释如何在animation中预加载单个纹理和纹理的任何内容。 我目前在Assets.xcassets使用Atlas来分组相关的animation图像。 在Atlas里有我的图像是否意味着它们被预装了? 就像单张图片一样,在GameScene之前声明纹理是否合理是这样的: let laserImage = SKTexture(imageNamed: "Sprites/laser.jpg")然后(例如)在我的SKSpriteNode子类中,我可以通过laserImage通过?

我最终想知道是否有一个明确的方式去做这个,或者如果我应该在GameScene之前将每个纹理存储为一个常量。 任何有关正确(而且最有效)的方式的build议都是很好的。

一个单一的纹理地图集

把你所有的资产放到一个Sprite Atlas中。 如果他们不适合,至less要把单个场景的所有资源放到一个Sprite Atlas中

预加载

如果你想要的话,你可以用这个代码在内存中预加载纹理图集

 SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler { // Now everything you put into the texture atlas has been loaded in memory } 

自动caching

您不需要保存对纹理图集的引用,SpriteKit具有内部caching系统。 让它做它的工作。

我应该用哪个名字来引用我的图片?

忘记文件图像的名称,您分配给图像的名称到资产目录中是您唯一需要的名称。

在这里输入图像说明

我怎样才能从图像创build一个精灵到纹理地图集?

 let texture = SKTextureAtlas(named:"croc").textureNamed("croc_walk01") let croc = SKSpriteNode(texture: texture) 

我试图实现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) 

引用已经加载到内存中的纹理。