Программно создать SKTileMapNode в Swift

Кто-нибудь знает, как создать SKTileMapNode программно с помощью Swift, пожалуйста? (ПРИМЕЧАНИЕ: я не хочу делать это с помощью редактора, я хочу добиться этого только программно)

Я пробовал следующее, но не отображал свою карту тайлов

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)

Любая помощь с благодарностью

2 ответа

Решение

Чтобы создать макет всей карты с одной фоновой плиткой, необходимо выполнить итерацию по каждому столбцу и каждой строке. Сначала вам нужно получить фоновую плитку.

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)
    }
}

Существует также удобная функция для достижения заливки;

bgNode.fill(with: tile)

Существует также инициализатор для SKTilemapNode что принимает SKTileGroup

let bgNode = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: bgTexture.size(), fillWithTileGroup: tile)

Я настоятельно рекомендую использовать функциональность, встроенную в Xcode, для создания TileSets и TileMaps. Вы все еще можете программно заполнить карту.

На случай, если это кому-нибудь пригодится, вот все это вместе:

class MyGameScene: SKScene {
    override func didMove(to view: SKView) {
        guard let tileSet = SKTileSet(named: "testset") else {
            // hint: don't use the filename for named, use the tileset inside
            fatalError()
        }

        let tileSize = tileSet.defaultTileSize // from image size
        let tileMap = SKTileMapNode(tileSet: tileSet, columns: 5, rows: 5, tileSize: tileSize)
        let tileGroup = tileSet.tileGroups.first
        tileMap.fill(with: tileGroup) // fill or set by column/row
        //tileMap.setTileGroup(tileGroup, forColumn: 5, row: 5)
        self.addChild(tileMap)
    }
}
Другие вопросы по тегам