昔、アップルはXcodeのシーンエディタにGameplayKit要素を導入しました。しかし、私は、ナビゲーショングラフ要素の問題を持っているように見える: GameplayKit>シーンエディタナビゲーショングラフ>経路探索にどのように使用しますか?
私が達成しようとするどのような、シーンエディタからGKGraphを描くコードでそれを取得し、経路探索のためのベースとしてそれを使用することです。
だから私は最初GKGraphを描く:
それから私はこのようGameScene.swiftでそれを取得:
グラフがストアにアップルによって事前に定義された配列であるgraph = self.graphs.values.first
シーンエディタからのGKGraphs。ここまでは順調ですね。
次に、プレーヤーが画面上のタップ位置へのパスを見つけたいと思います。このために、私は以下のコールバックメソッドでUITapGestureRecognizerを使用します。このメソッドを使用して
var moving = false
func moveToLocation(recognizer: UITapGestureRecognizer) {
var tapLocation = recognizer.location(in: recognizer.view!)
tapLocation = self.convertPoint(fromView: tapLocation)
guard (!moving) else { return }
moving = true
let startNode = GKGraphNode2D(point: vector_float2(Float(player.visualComponent.node.position.x), Float(player.visualComponent.node.position.y)))
let endNode = GKGraphNode2D(point: vector_float2(Float(tapLocation.x), Float(tapLocation.y)))
NSLog(graph.nodes.debugDescription)
graph.connectToLowestCostNode(node: startNode, bidirectional: true)
graph.connectToLowestCostNode(node: endNode, bidirectional: true)
NSLog(graph.nodes.debugDescription)
let path: [GKGraphNode] = graph.findPath(from: startNode, to: endNode)
guard path.count > 0 else { moving = false; return }
var actions = [SKAction]()
for node: GKGraphNode in path {
if let point2d = node as? GKGraphNode2D {
let point = CGPoint(x: CGFloat(point2d.position.x), y: CGFloat(point2d.position.y))
let action = SKAction.move(to: point, duration: 1.0)
actions.append(action)
}
}
graph.remove([startNode, endNode])
// Convert those actions into a sequence action, then run it on the player node.
let sequence = SKAction.sequence(actions)
player.visualComponent.node.run(sequence, completion: {() -> Void in
// When the action completes, allow the player to move again.
self.moving = false
})
}
、私は、タップ位置に移動するプレーヤーを取得します。問題は、GameplayKitによって返されるパスには、startNodeとendNodeしか含まれていないことです。つまり、プレーヤはGKGraphをあらかじめ描画していなくても、endNodeにまっすぐ歩きます。
注:初めて実行するときNSLog(graph.nodes.debugDescription)は、すべての10個の描画済みノードをリストします。私がgraph.connectToLowestCostNodeの後に再びそれを実行すると、私は12のノードをすべて取得します。だから私のグラフには、経路探索に必要なものがすべて含まれているようです。
あなたはどう思いますか?なぜgraph.findPathは、パスを定義するために事前に描かれた10ノードを使用していないのですか?あなたの答えは高く評価されるだろう。
どのように私の迅速なコードでそのグラフオブジェクトを取得できますか? – Araf