sprite-kitswift3ios10sktilemapnode

Programmatically create SKTileMapNode in Swift


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


Solution

  • 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.