enableAutomapping и SKTileMapNode: создавать фигуры с ребрами программно?
Я пытаюсь создать гибкое диалоговое окно программно для текста диалога в игре в стиле RPG. Я разработал простую коробочную графику, разделил ее на все правильные части и добавил в свой набор плиток как группа смежности с 8 путями.
Я могу успешно добавить его в свой узел камеры, но автоматическое отображение не работает. Все, что я получаю, это сплошной черный ящик, составленный из центральной плитки. В соответствии с документацией 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 ответ
Совет по программной работе со 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)
}