enableAutomapping и SKTileMapNode: создавать фигуры с ребрами программно? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь программно создать гибкое диалоговое окно для текста диалога в игре в стиле RPG.Я разработал простую графическую рамку, разделил ее на все правильные части и добавил в свой набор плиток как группа смежности с 8 путями.

enter image description here

Я могу успешно добавить его в свой узел камеры, но автоматическое сопоставление не работает.Все, что я получаю, это сплошной черный ящик, составленный из центральной плитки.В соответствии с документацией Apple , enableAutomapping "определяет, использует ли карта тайлов поведение, основанное на автоподстановке, как редактор сцены", поэтому я считаю, что этот параметр должен мне помочь.

Он выбирает только центральную плитку, игнорируетвсе края / углы, и я получаю сплошную черную коробку.Я ищу поведение для SpriteKit, чтобы выбрать соответствующий край и внутреннюю плитку в зависимости от формы, которую я создаю.

Вот как выглядит мой код (Swift 4.2):

func createDialogBox() {
    let dialogTileSet = SKTileSet(named: "Dialog")!

    for tileGroup in dialogTileSet.tileGroups {
        for tileRule in tileGroup.rules {
            for tileDefinition in tileRule.tileDefinitions {
                for texture in tileDefinition.textures {
                    texture.filteringMode = .nearest
                }
            }
        }
    }

    let tileSize = CGSize(width: 32, height: 32)
    let rows = 3, cols = 12

    let dialogBox = SKTileMapNode(tileSet: dialogTileSet,
                                  columns: cols,
                                  rows: rows,
                                  tileSize: tileSize)

    dialogBox.enableAutomapping = true

    for col in 0..<cols {
        for row in 0..<rows {
            dialogBox.setTileGroup(dialogTileSet.tileGroups.first, forColumn: col, row: row)
        }
    }

    dialogBox.zPosition = 2
    dialogBox.position = CGPoint(x: 48, y: -128)
    self.camera?.addChild(dialogBox)
}

1 Ответ

0 голосов
/ 24 декабря 2018

Рекомендации по программной работе с SpriteKit и SKTileMapNodes: узнайте, как работает редактор в Xcode, прежде чем пытаться сделать это в коде.Задав свой вопрос, я решил построить его в редакторе и понял, что моя концептуальная модель узлов карты тайлов неверна.

Я смог решить свою проблему, осознав, что с включенным автоматическим сопоставлением вам нужно тольконарисуйте центр фигуры.Ребра заполнены, и размер TileMapNode должен быть в состоянии разместить ребра.Мне пришлось сделать мой TileMapNode немного больше.

Теперь это работает.Вот код (Swift 4.2):

func createDialogBox(string: String) {
    let dialogTileSet = SKTileSet(named: "Dialog")!

    for tileGroup in dialogTileSet.tileGroups {
        for tileRule in tileGroup.rules {
            for tileDefinition in tileRule.tileDefinitions {
                for texture in tileDefinition.textures {
                    texture.filteringMode = .nearest
                }
            }
        }
    }

    let tileSize = CGSize(width: 32, height: 32)
    let rows = 5, cols = 14 // Increased the size of the tile map node.

    let dialogBox = SKTileMapNode(tileSet: dialogTileSet,
                                  columns: cols,
                                  rows: rows,
                                  tileSize: tileSize)

    dialogBox.enableAutomapping = true

    // Just draw the center line. Automapping will take care of the surrounding edges.
    for col in 2...11 {
        dialogBox.setTileGroup(dialogTileSet.tileGroups.first, forColumn: col, row: 2)
    }

    dialogBox.zPosition = 2
    dialogBox.position = CGPoint(x: 48, y: -128)
    self.camera?.addChild(dialogBox)
}
...