让GKObstacleGraph与SKTileMapNode一起使用

时间:2016-12-01 20:12:58

标签: sprite-kit path-finding gameplay-kit sktilemapnode

我目前在Xcode 8工作,使用Swift 3和SpritKit的新SKTileMapNode来制作2D地下城爬虫类型的游戏。 我无法让GKObstacleGraph使用tilemap。请帮忙! 我试图遍历tilemap的障碍层内的所有tile,并为每个tile创建一个多边形并将其存储在GKObstacleGraph中。障碍层中的每个瓦片是墙砖。地图看起来像某种类型的地下城爬行器,所以墙壁到处都是。 我有类似下面的内容:

for row in 0..<tileMapNode.numberOfRows {
  for column in 0..<tileMapNode.numberOfColumns {
     let tile = tileMapNode.tileDefinition(atColumn: column, row: row)
     let tileCenter = tileMapName.centerOfTile(atColumn: column, row: row)
     //find 4 corners of each tile from its center
     let bottomLeft = float2(CGPointMake(tileCenter.x - tile.size.width/2, tileCenter.y - tile.size.height/2))
     let bottomRight = float2(CGPointMake((tileCenter.x - tile.size.width/2, tileCenter.y + tile.size.height/2))
     let topRight = float2(CGPointMake((tileCenter.x + tile.size.width/2, tileCenter.y + tile.size.height/2)) 
     let topLeft = float2(CGPointMake((tileCenter.x - tile.size.width/2, tileCenter.y + tile.size.height/2))
     var vertices = [topLeft , bottomLeft , bottomRight , topRight ]
     let obstacle = GKPolygonObstacle(points: &vertices, count: 4)
     obstacleGraph.add(obstacle)
  }
}

但是,当我运行应用程序时,它显示有超过80000个节点,路径寻找路径太多。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不确定GKObstacleGraph是图表的正确选择。根据{{​​3}}:

  

例如,您可以使用Xcode中的SpriteKit场景编辑器设计一个关卡,并使用物理实体标记玩家(或其他游戏实体)无法通过的区域,然后使用barriersFromNodePhysicsBodies:方法生成标记无法通过的GKPolygonObstacle对象区域。

函数obstaclesFromNodePhysicsBodies用于提取障碍物并创建图表;

let obstacles = SKNode.obstaclesFromNodePhysicsBodies(self.children)
graph = GKObstacleGraph(obstacles: obstacles, bufferRadius: 0.0)

对于代表笛卡尔网格的SKTilemapNodeGKGridGraph似乎是可能的选择。