使用SpriteKit在Swift中通过名称获取TileDefinition

时间:2016-11-20 03:57:07

标签: swift sprite-kit sktilemapnode

我在名为CountTiles.sks的文件中定义了TileSet。我有一个瓦片组规则有几个变种。在我的GameScene.swift文件中,我想填充一个tileMapNode特定的变体,所以我想我会使用包含定义的setTileGroup方法,但要调用它,我需要已经将该定义存储在变量中。有没有办法让tileDefinition使用它的名字?我似乎能够获得它的唯一方法是将其绘制到特定的图块中并在设置期间从该图块中获取它。这是不可取的。

有没有办法访问在.sks文件中设置的tileDefinition而没有该tileDefinition的特定实例?

1 个答案:

答案 0 :(得分:0)

您可以通过SKTileMapNode访问平铺定义,例如将SKTileMapNode添加到地图编辑器时,它具有关联的SKTileSet。因此,如果您的CountTiles.sks具有此类结构,则

  • BackgroundTiles(平铺集)
    • Tiles(Tile Group)
    • 瓷砖(瓷砖组规则)
      • Tile1(平铺定义)
      • Tile2(平铺定义)
      • Tile3(平铺定义)

您可以访问特定的平铺定义,例如Tile1的函数可以像这样调用名为SKTileMapNode的{​​{1}};

background

像这样调用函数;

func backgroundTileDefinition(key: String) -> SKTileDefinition {
    guard let backgroundLayer = childNode(withName: "background") as? SKTileMapNode else {
        fatalError("Background node not loaded")
    }

    guard let backgroundTile = backgroundLayer.tileSet.tileGroups.first(where: {$0.name == "Tiles"}) else {
        fatalError("TileSet not found")
    }

    guard let backgroundTileSetRule = backgroundTile.rules.first(where: {$0.name == "Tile"}) else {
        fatalError("Tileset rule not found")
    }

    guard let backgroundTileDefinition = backgroundTileSetRule.tileDefinitions.first(where: {$0.name == key}) else {
        fatalError("Tile definition not found")
    }

    return backgroundTileDefinition
}