在 xCode 中使用多个资产文件夹
Use multiple asset folders in xCode
所以我正在使用 SpriteKit 开发游戏。我有一个为玩家生成关卡的功能。
该函数使用放置在 assets.xcassets 中的图像来生成关卡。游戏有多个主题,即火水和电。每个主题都有自己的同名图像集,但每个主题图像集都在其单独的 folder/group 中。我是否可以通过编程方式告诉函数使用特定文件夹,以便我可以在不重命名图像的情况下为其他主题生成级别。或者我是否可以使用多个资产文件夹并更改函数在运行时使用的文件夹。每次玩家重新启动关卡时,我都想使用随机主题。
雪碧图集/雪碧Sheet
您可以使用 Sprite Atlas(也称为 Sprite Sheet)。
If you don't know what I'm talking about have a look at these 2 nice videos:
如何使用
如果您现在看过视频,您就会知道 Sprite Atlas 的主要目标是将所有且仅(尽可能)当前场景或关卡所需的图像加载到 GPU 中。这种方式绘制每一帧变得更快,因为所有资源都已经在 GPU 上,CPU 只需要传输坐标。
命名空间
好的,但是它如何解决您的问题?
Xcode 允许您为每个 Sprite Atlas 创建一个命名空间。所以你可以在不同的Sprite Atlas中对资源使用相同的名称。
如何创建精灵图集。
这很简单。
- 用Xcode打开你
Asset Catalog
- 点击您在下图中看到的
+
按钮
- 点击
New Sprite Atlas
- 您会看到一个新的 "Folder",那就是您的 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)
}
}
结果
它是如何工作的
第 1 步:加载 Sprite Atlas
let textureAtlas0 = SKTextureAtlas(named: "Sprites0")
第 2 步:从纹理图集加载特定纹理
let texture0 = textureAtlas0.textureNamed("circle")
第 3 步:随心所欲地使用纹理
let sprite0 = SKSpriteNode(texture: texture0)
sprite0.position.y = 100
addChild(sprite0)
所以我正在使用 SpriteKit 开发游戏。我有一个为玩家生成关卡的功能。
该函数使用放置在 assets.xcassets 中的图像来生成关卡。游戏有多个主题,即火水和电。每个主题都有自己的同名图像集,但每个主题图像集都在其单独的 folder/group 中。我是否可以通过编程方式告诉函数使用特定文件夹,以便我可以在不重命名图像的情况下为其他主题生成级别。或者我是否可以使用多个资产文件夹并更改函数在运行时使用的文件夹。每次玩家重新启动关卡时,我都想使用随机主题。
雪碧图集/雪碧Sheet
您可以使用 Sprite Atlas(也称为 Sprite Sheet)。
If you don't know what I'm talking about have a look at these 2 nice videos:
如何使用
如果您现在看过视频,您就会知道 Sprite Atlas 的主要目标是将所有且仅(尽可能)当前场景或关卡所需的图像加载到 GPU 中。这种方式绘制每一帧变得更快,因为所有资源都已经在 GPU 上,CPU 只需要传输坐标。
命名空间
好的,但是它如何解决您的问题?
Xcode 允许您为每个 Sprite Atlas 创建一个命名空间。所以你可以在不同的Sprite Atlas中对资源使用相同的名称。
如何创建精灵图集。
这很简单。
- 用Xcode打开你
Asset Catalog
- 点击您在下图中看到的
+
按钮
- 点击
New Sprite Atlas
- 您会看到一个新的 "Folder",那就是您的 Sprite Atlas。
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)
}
}
结果
它是如何工作的
第 1 步:加载 Sprite Atlas
let textureAtlas0 = SKTextureAtlas(named: "Sprites0")
第 2 步:从纹理图集加载特定纹理
let texture0 = textureAtlas0.textureNamed("circle")
第 3 步:随心所欲地使用纹理
let sprite0 = SKSpriteNode(texture: texture0)
sprite0.position.y = 100
addChild(sprite0)