【问题标题】:Use multiple asset folders in xCode在 xCode 中使用多个资产文件夹
【发布时间】:2018-08-17 04:48:17
【问题描述】:

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

【问题讨论】:

  • 据我所知,您不能将具有相同名称的图像保存在同一个文件夹中,并且您从 Assets 文件夹访问的图像不是基于文件夹而是基于图像名称。所以最好的方法是根据主题保留图像名称,并根据主题以编程方式设置这些图像。
  • 是否可以在项目导航器中创建多个资产文件夹,如 assets1.xcassets、assets2.xcassets 等,并以编程方式访问每个文件夹
  • 是的!单击添加新文件转到资源或搜索资产目录并添加资产目录名称,随便你
  • 不建议有 2 个同名文件,图像库的工作方式是即使指向错误的位置也会尽力找到具有给定名称的文件。我建议使用字符串插值并使用单独的精灵图集。示例let fireblock = SKSprite(imageNamed(“fire_\(block)”)
  • 你甚至可以做let block = SKSpriteNode(imageNamed:”\(level)_\(block)”)

标签: ios swift xcode sprite-kit assets


【解决方案1】:

精灵图集/精灵表

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

如果您不知道我在说什么,请观看以下 2 个不错的视频:

如何使用

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

命名空间

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

Xcode 允许您为每个 Sprite Atlas 创建一个命名空间。因此,您可以在不同的 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 Namespacecheckbox
  • 将命名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)

【讨论】:

  • 我知道这不是在 stackoverflow 上提问的正确方式,但鉴于您过去已经回答了我的两个问题,我认为您可以帮助我解决这个问题 -> stackoverflow.com/q/52443919/9649381
  • 好的,我稍后再看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2013-06-20
  • 2019-12-24
相关资源
最近更新 更多