0

我正在使用 SKTilemapNode。如何正确使用带有 GameplayKit 的 Pathfinding?

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

4

2 回答 2

6

这就是我使用我的一个瓦片地图的内容实现 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属性:

在此处输入图像描述

这样你就可以得到没有 osbtacles 的结果网格图。

于 2017-05-16T22:21:54.437 回答
3

基本思想是创建一个SKGridGraph连接的节点,然后删除无法行走的节点。GameplayKit 指南显示了一个示例(清单 6-1 生成网格图)。因此,在您的情况下,使用SKTilemapNode图形的宽度和高度取决于地图上的瓦片宽度和高度,例如,如果您的地图是 32 瓦片宽和 18 片瓦片高,则使用宽度 32 和高度 18 初始化图形。

于 2017-02-07T03:04:31.387 回答