我有一张可以由用户放置障碍物的地图。从地图右边移动到左边的精灵。
当用户放置障碍物时,它们会添加到我的游戏图形(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
出于某种原因,它正在删除图表中的所有其他节点,即使我只删除了一个障碍物。