我有一张地图,上面有用户可以放置的障碍物。以及从地图右侧移动到左侧的精灵。
当用户放置障碍物时,它们会被添加到我的游戏图表 (GKObstacleGraph) 中,并且每次我检查从起点到终点的路径是否可用。如果不是,则表示用户已经完全挡住了路径,所以我移除了放置的障碍物。
那应该会再次打开路径,但事实并非如此。好像障碍还在。
我有一个调试函数,它循环遍历我的图形节点中的所有障碍,直观地向我展示它们的位置。每次我添加障碍物时它都会运行。在我放置一个阻挡路径的障碍物(然后立即将其移除)之后,它表明那里没有障碍物。路径是明确的。
func createObstacle(coordinates: CCCordinates) {
let tX = -game.mapSize.widthHalf + (coordinates.x*game.tileSize.value) + (game.tileSize.valueHalf)
let tY = game.mapSize.heightHalf - (coordinates.y*game.tileSize.value) - (game.tileSize.valueHalf)
let obstacle = CCObstacle(color: color.red, size: game.obstacleSize.size)
obstacle.position = CGPoint(x: tX, y: tY)
let polygonObstacle = getPolygonObstacleForSpriteNode(obstacle)
game.graph.addObstacles([polygonObstacle])
let pathClear = checkPath()
print("Path Clear: \(pathClear)")
if pathClear {
let texture = SKTexture(imageNamed: "obstacle")
obstacle.texture = texture
obstacle.coordinates = coordinates
obstacle.name = "obstacle:\(obstacle.coordinates.convertToString())"
obstacle.zPosition = 5
for var i = 0; i < game.sprites.count; i++ {
let sprite = game.sprites[i]
updatePathForSprite(sprite)
}
panels.map.addChild(obstacle)
} else {
game.graph.removeObstacles([polygonObstacle])
print("removedObstacle")
}
drawAllObstacleOutlines()
}
此代码完美运行,直到 pathClear 返回 false 并且 else 中的代码运行。即使从图中移除了障碍物(并且 drawAllObstacleOutlines() 函数证实了这一点) pathClear 之后总是返回 false 。
除非我使用:
game.graph.removeAllObstacles()
如果我用上面的那一行替换 removeObstacles([]) 行。它让我再次设置障碍。(即使我将所有已移除的障碍物加回来,它仍然有效,不包括阻挡路径的障碍物。)
函数 updatePathForSprite 基本上在下面调用这个:
func getPathForNodeToEndPoint(startPoint: CGPoint) -> [GKGraphNode] {
let startNode = GKGraphNode2D(point: float2(Float(startPoint.x), Float(startPoint.y)))
let endNode = GKGraphNode2D(point: float2(Float(game.finishPoint.x), Float(game.finishPoint.y)))
game.graph.connectNodeUsingObstacles(startNode, ignoringBufferRadiusOfObstacles: game.outerTileObstacles)
game.graph.connectNodeUsingObstacles(endNode, ignoringBufferRadiusOfObstacles: game.outerTileObstacles)
let path:[GKGraphNode2D] = game.graph.findPathFromNode(startNode, toNode: endNode) as! [GKGraphNode2D]
game.graph.removeNodes([startNode, endNode])
return path
}
有谁知道这里发生了什么?
编辑:我可能发现了一些奇怪的东西。
当我在 drawAllObstacleOutlines() 行上方添加以下行时:
print("Obstacles \(game.graph.obstacles.count)")
print("Nodes \(game.graph.nodes!.count)")
它随着我添加障碍物而增加......在我的情况下,节点是 404,障碍物是 101,但是当我放置阻挡路径的障碍物时,输出是:障碍物 101,节点 0
出于某种原因,它删除了图中的所有其他节点,即使我只删除了一个障碍。