does anyone know how to create an SKTileMapNode programmatically using Swift please? (NOTE: I do not want to do this using the editor, I want to achieve this programmatically only)
I have tried the following but does not render my tile map
let bgTexture = SKTexture(imageNamed: "background")
let bgDefinition = SKTileDefinition(texture: bgTexture, size: bgTexture.size())
let bgGroup = SKTileGroup(tileDefinition: bgDefinition)
let tileSet = SKTileSet(tileGroups: [bgGroup])
let bgNode = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: bgTexture.size())
bgNode.position = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height / 2)
bgNode.setScale(1)
self.addChild(bgNode)
Any help greatly appreciated
To layout the entire map with the single background tile you would iterate through each column and each row. You'll need to retrieve the background tile first.
let tile = bgNode.tileSet.tileGroups.first(
where: {$0.name == "background"})
for column in 0..4 {
for row in 0..4 {
bgNode.setTileGroup(tile, forColumn: column, row: row)
}
}
There is also a convenience function to achieve a flood fill;
bgNode.fill(with: tile)
There is also an initialiser for SKTilemapNode
that accepts SKTileGroup
let bgNode = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: bgTexture.size(), fillWithTileGroup: tile)
I strongly recommend to leverage the functionality built into Xcode for creating TileSets and TileMaps. You can still programatically fill the map.