2016-12-18 10 views
3

昔、アップルはXcodeのシーンエディタにGameplayKit要素を導入しました。しかし、私は、ナビゲーショングラフ要素の問題を持っているように見える: Scene Editor Navigation GraphGameplayKit>シーンエディタナビゲーショングラフ>経路探索にどのように使用しますか?

私が達成しようとするどのような、シーンエディタからGKGraphを描くコードでそれを取得し、経路探索のためのベースとしてそれを使用することです。

だから私は最初GKGraphを描く:

Scene Editor drawn 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によって返されるパスには、startNodeendNodeしか含まれていないことです。つまり、プレーヤはGKGraphをあらかじめ描画していなくても、endNodeにまっすぐ歩きます。

注:初めて実行するときNSLog(graph.nodes.debugDescription)は、すべての10個の描画済みノードをリストします。私がgraph.connectToLowestCostNodeの後に再びそれを実行すると、私は12のノードをすべて取得します。だから私のグラフには、経路探索に必要なものがすべて含まれているようです。

あなたはどう思いますか?なぜgraph.findPathは、パスを定義するために事前に描かれた10ノードを使用していないのですか?あなたの答えは高く評価されるだろう。

+0

どのように私の迅速なコードでそのグラフオブジェクトを取得できますか? – Araf

答えて

2

Scene Editorで作成したGKGraphで呼び出されたときに、GameplayKitの.findPathメソッドが正しく動作しないようです。それだけで正常に動作に

let newGraph = GKGraph() 
for drawnNode in graph.nodes! { 
    newGraph.add([drawnNode]) 
} 
その後

.findPath

newGraph.connectToLowestCostNode(node: startNode, bidirectional: true) 
newGraph.connectToLowestCostNode(node: endNode, bidirectional: true) 
let path: [GKGraphNode] = newGraph.findPath(from: startNode, to: endNode) 

変数pathが含まれている私は何をしたか、私はプログラムで作成GKGraphプリ描かGKGraphからノードをクローン化しました現在10 + 2ノードすべてを考慮して生成されたパスです。

後編:シーンエディタで作成したナビゲーショングラフを経路探索に直接使用することはできません。私のソリューションは、最初にノードをプログラムで作成したGKGraphにクローンし、残りの作業に最新のものを使用することでした。

関連する問題