在 xCode 中使用多个资产文件夹

Ama*_*oor 5 xcode assets ios sprite-kit swift

所以我正在 SpriteKit 中开发一款游戏。我有一个为玩家生成关卡的函数。该函数使用放置在 assets.xcassets 中的图像来生成关卡。游戏有多个主题,分别是火水和电。每个主题都有自己的一组名称相同的图像,但每个主题图像组都在其单独的文件夹/组中。我是否可以以编程方式告诉函数使用特定文件夹,以便我可以在不重命名图像的情况下为其他主题生成级别。或者我是否可以使用多个资产文件夹并更改函数在运行时使用的一个。每次玩家重新启动关卡时,我都想使用随机主题。资产文件夹

Luc*_*tti 7

雪碧图集/雪碧表

您可以使用 Sprite Atlas(也称为 Sprite Sheet)。

如果你不知道我在说什么,看看这两个不错的视频:

如何使用它

如果您现在已经观看了视频,您就会知道 Sprite Atlas 的主要目标是将所有且仅(尽可能)当前场景或关卡所需的图像加载到 GPU 中。这种方式绘制每一帧变得更快,因为所有资源都已经在 GPU 和 CPU 上,只需要传输坐标。

命名空间

好的,但它如何解决您的问题?

Xcode 允许您为每个 Sprite Atlas 创建一个命名空间。所以你可以对不同 Sprite Atlas 中的资源使用相同的名称。

如何创建一个精灵图集。

这很简单。

  1. 用 Xcode 打开你 Asset Catalog
  2. 点击+您在下图中看到的按钮

在此处输入图片说明

  1. 点击 New Sprite Atlas
  2. 你会看到一个新的“文件夹”,那就是你的 Sprite Atlas。

在此处输入图片说明 5. 现在单击Provides Namespace右侧的 复选框。

就是这样。现在只需将您的图像放入 Sprites 文件夹,以便将它们添加到您的精灵图集中。

在这个例子中,我将把 Sprite Atlas 重命名为Sprites0,并将添加一个名为 的红色圆圈circle

然后

  • 将创建另一个 Sprite Atlas
  • 将再次检查Provides Namespace复选框
  • 将命名 Sprites1
  • 最后将添加一个绿色圆圈名称circle

这是最终结果

在此处输入图片说明

代码

现在让我们看看如何使用它。

导入 SpriteKit

class GameScene: SKScene {

    override func didMove(to view: SKView) {

        let textureAtlas0 = SKTextureAtlas(named: "Sprites0")
        let texture0 = textureAtlas0.textureNamed("circle")
        let sprite0 = SKSpriteNode(texture: texture0)
        sprite0.position.y = 100
        addChild(sprite0)

        let textureAtlas1 = SKTextureAtlas(named: "Sprites1")
        let texture1 = textureAtlas1.textureNamed("circle")
        let sprite1 = SKSpriteNode(texture: texture1)
        sprite1.position.y = -100
        addChild(sprite1)

    }
}
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

它是如何工作的

第 1 步:加载 Sprite Atlas

let textureAtlas0 = SKTextureAtlas(named: "Sprites0")
Run Code Online (Sandbox Code Playgroud)

第 2 步:从纹理图集中加载特定纹理

let texture0 = textureAtlas0.textureNamed("circle")
Run Code Online (Sandbox Code Playgroud)

第 3 步:根据需要使用纹理

let sprite0 = SKSpriteNode(texture: texture0)
sprite0.position.y = 100
addChild(sprite0)
Run Code Online (Sandbox Code Playgroud)