2016-12-18 108 views
3

不久前,Apple將GameplayKit元素引入了Xcode的場景編輯器,這非常棒。但是,我似乎有問題與導航圖形元素: 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返回的路徑只包括的StartNode終端節點,這意味着玩家不走在預抽GKGraph可言而是直接走到終端節點

注意:當我第一次運行NSLog(graph.nodes.debugDescription)它列出了所有10個預先繪製的節點。當我在graph.connectToLowestCostNode之後再次運行時,我得到了所有12個節點。所以我的圖似乎包含尋路所需的一切。

您認爲是什麼問題?爲什麼graph.findPath不使用預繪製的10個節點來定義路徑?你的答案將不勝感激。

+0

如何在我的swift代碼中獲取該圖形對象? – Araf

回答

2

好像GameplayKit的.findPath方法在從場景編輯器創建的GKGraph上調用時無法正常工作。我所做的是,我克隆從預先繪製GKGraph的編程方式創建GKGraph節點:.findPath

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

然後,在它工作得很好:

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

可變path包含現在考慮所有10 + 2個節點而生成的路徑。

總結:您無法直接使用在場景編輯器中創建的導航圖進行尋路。我的解決方案是首先將其節點克隆到以編程方式創建的GKGraph中,然後使用最新版本完成剩下的工作。

相關問題