1

ユーザーが配置できる障害物を含むマップがあります。そして、マップの右から左に移動するスプライト。

ユーザーが障害物を配置すると、それらがゲームのグラフ (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

何らかの理由で、障害を 1 つだけ削除したにもかかわらず、グラフ内の他のすべてのノードが削除されています。

4

0 に答える 0