【问题标题】:Pathfinding on Tilemap with GameplayKit使用 GameplayKit 在 Tilemap 上进行寻路
【发布时间】:2017-02-06 15:10:07
【问题描述】:

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

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

【问题讨论】:

  • 这个 youtuber 在 SKEditor 中非常广泛地使用了寻路功能。这不是一个教程,但他已经成功地在他的游戏中实现了寻路功能。 youtube.com/user/Veeneck/videos。此外,您可能需要观看苹果在其网站上与此相关的 WWDC 2016 视频。

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


【解决方案1】:

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

这样您就可以得到没有障碍物的网格图。

【讨论】:

  • 对于使用此 sn-p 的任何人...该图表设置为错误的尺寸。它设置为宽 = 列和高度 = 列。如果您有一个矩形大小的网格,则必须将其更改为 height = rows
【解决方案2】:

基本思想是创建一个连接节点的SKGridGraph,然后移除不能行走的节点。 GameplayKit Guide 显示了一个示例(清单 6-1 生成网格图)。因此,在您使用SKTilemapNode 的情况下,图形的宽度和高度由地图上的平铺宽度和高度的数量决定,例如如果您的地图是 32 瓦宽和 18 瓦高,则将图形初始化为宽度为 32 和高度为 18。

【讨论】:

  • 你有很好的 SKGridGraph 教程吗?您发布的指南对我来说不是那么好
  • This tutorial 是使用 SpriteKit 和 GameplayKit 构建塔防游戏的一个很好的例子。它使用SKGridGraph
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多