使用GameplayKit在Tilemap上寻路

时间:2017-02-06 15:10:08

标签: swift sprite-kit path-finding tiled sktilemapnode

我正在使用SKTilemapNode。 如何正确使用PathplayKit与PathplayKit一起使用?

一些信息:墙壁都是瓷砖,没有瓷砖是'方式'

2 个答案:

答案 0 :(得分:5)

这是我使用我的某个瓷砖地图的内容实现GKGridGraph的方式:

    let graph = GKGridGraph(fromGridStartingAt: vector_int2(0,0), width: Int32(tileMap.numberOfColumns), height: Int32(tileMap.numberOfColumns), diagonalsAllowed: false)

    var obstacles = [GKGridGraphNode]()

    for column in 0..<tileMap.numberOfColumns
    {
        for row in 0..<tileMap.numberOfRows
        {
            let position = tileMap.centerOfTile(atColumn: column, row: row)

            guard let definition = tileMap.tileDefinition(atColumn: column, row: row) else { continue }

            guard let userData = definition.userData else { continue }
            guard let isObstacle = userData["isObstacle"] else { continue }

            if isObstacle
            {
                let wallNode = graph.node(atGridPosition: vector_int2(Int32(column),Int32(row)))!
                obstacles.append(wallNode)
            }
        }
    }

    graph.remove(obstacles)

我必须在障碍物瓷砖的userData字段中设置 isObstacle 属性:

enter image description here

通过这种方式,您可以获得没有osbtacles的结果网格图。

答案 1 :(得分:3)

基本思想是创建一个SKGridGraph连接的节点,然后删除无法行走的节点。 GameplayKit Guide显示了一个示例(清单6-1生成网格图)。因此,在您使用SKTilemapNode的情况下,图表的宽度和高度由地图上的图块宽度和高度确定,例如如果您的地图是32个瓷砖宽,18个瓷砖高,则初始化图表,宽度为32,高度为18。