阻塞和解除阻塞路径后,路径查找不再有效

时间:2015-11-09 08:17:58

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

我有一张可以由用户放置障碍物的地图。从地图右边移动到左边的精灵。

当用户放置障碍物时,它们会添加到我的游戏图形(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

出于某种原因,它正在删除图表中的所有其他节点,即使我只删除了一个障碍物。

0 个答案:

没有答案