ユーザーが配置できる障害物を含むマップがあります。そして、マップの右から左に移動するスプライト。
ユーザーが障害物を配置すると、それらがゲームのグラフ (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 つだけ削除したにもかかわらず、グラフ内の他のすべてのノードが削除されています。