不久前,苹果将GameplayKit元素引入了Xcode的场景编辑器中,这非常棒。然而,我发现导航图元素存在问题:
我的目标是从场景编辑器中绘制一个GKGraph,在代码中检索它,并将其用作寻路的基础。
因此,我首先绘制了一个GKGraph:
然后,我在GameScene.swift中像这样检索它:
使用该方法,我让玩家前往水龙头位置。问题是GameplayKit返回的路径只包括startNode和endNode,这意味着玩家根本没有在预先绘制的GKGraph上行走,而是直接走向endNode。
注意:当我首次运行NSLog(graph.nodes.debugDescription)时,它列出了所有10个预先绘制的节点。然后在运行graph.connectToLowestCostNode之后再次运行它,我会得到12个节点。所以我的图表似乎包含了路径查找所需的一切。
你认为问题出在哪里?为什么graph.findPath没有使用预先绘制的10个节点来定义路径?非常感谢您的回答。
![场景编辑器导航图](https://istack.dev59.com/5M11b.webp)
因此,我首先绘制了一个GKGraph:
![场景编辑器绘制的GKGraph](https://istack.dev59.com/dwWBx.webp)
graph = self.graphs.values.first
这里的graphs是苹果预定义的数组,用于存储来自场景编辑器的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个节点来定义路径?非常感谢您的回答。