enableAutomapping和SKTileMapNode:以编程方式创建带有边缘的形状吗?

时间:2018-12-24 04:45:08

标签: swift sprite-kit sktilemapnode

我试图以编程方式为RPG风格的游戏中的对话框文本创建一个灵活的对话框。我设计了一个简单的盒子图形,将其划分为所有正确的部分,并将其作为8向邻接组添加到我的图块集中。

enter image description here

我可以成功将其添加到我的相机节点,但是自动映射不起作用。我所得到的只是一个由中心瓷砖组成的黑色实心盒子。根据{{​​3}},enableAutomapping“指定图块贴图是否使用场景编辑器之类的自动映射行为,”因此,我相信此设置应该对我有帮助。

它只选择中间的图块,忽略所有的边/角,我得到一个纯黑框。我要寻找的行为是让SpriteKit根据要创建的形状选择合适的边缘和内部瓷砖。

这是我的代码(Swift 4.2)当前的样子:

autocmd InsertEnter * :highlight LineNr ctermfg=blue ctermbg=red
autocmd InsertLeave * :highlight LineNr ctermfg=blue ctermbg=red

1 个答案:

答案 0 :(得分:0)

关于以编程方式使用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)
}