使用 GameplayKit 在 Tilemap 上寻路
Pathfinding on Tilemap with GameplayKit
我正在使用 SKTilemapNode。
如何正确使用 GameplayKit 的 Pathfinding?
一些信息:墙壁都是瓷砖,没有瓷砖 'ways'
基本思路是创建 SKGridGraph
个连接节点,然后删除无法行走的节点。 GameplayKit Guide 显示了一个示例(清单 6-1 生成网格图)。因此,在您使用 SKTilemapNode
的情况下,图形的宽度和高度由地图上宽度和高度的图块数量决定,例如如果您的地图宽 32 格,高 18 格,则将图形初始化为宽度 32 和高度 18。
这就是我使用我的一张瓷砖地图的内容实现 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)
我必须在障碍物拼贴的用户数据字段中设置 isObstacle 属性:
这样你就可以得到没有 osbtacles 的结果网格图。
我正在使用 SKTilemapNode。 如何正确使用 GameplayKit 的 Pathfinding?
一些信息:墙壁都是瓷砖,没有瓷砖 'ways'
基本思路是创建 SKGridGraph
个连接节点,然后删除无法行走的节点。 GameplayKit Guide 显示了一个示例(清单 6-1 生成网格图)。因此,在您使用 SKTilemapNode
的情况下,图形的宽度和高度由地图上宽度和高度的图块数量决定,例如如果您的地图宽 32 格,高 18 格,则将图形初始化为宽度 32 和高度 18。
这就是我使用我的一张瓷砖地图的内容实现 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)
我必须在障碍物拼贴的用户数据字段中设置 isObstacle 属性:
这样你就可以得到没有 osbtacles 的结果网格图。