情况
我正在使用 GKObstacleGraph 在以下地图上进行寻路:
橙色区域是障碍物 (GKPolygonObstacle),而紫色点和线是自定义放置的节点 (GKGraphNode2D) 及其各自的连接,实体可以使用它们来传送穿过障碍物。
目标
我认为在方法上是正确的是将紫色节点之间的成本设置为 0(因为它们是门户)。考虑到这一点,我首先将所有紫色节点子类化为 DoorGraphNodes:
import SpriteKit
import GameplayKit
class DoorGraphNode: GraphNode {
var id: String!
var floor: Int!
var complement: DoorGraphNode!
init(position: CGPoint, id: String, floor: Int) {
self.id = id
self.floor = floor
let point = vector_float2(Float(position.x), Float(position.y))
super.init(point: point)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setComplement(doorNode: DoorGraphNode) {
self.complement = doorNode
}
}
然后,我将所有要添加到 GKObstaclesGraph 的 GKGraphNode2D 节点子类化为 GraphNode:
import SpriteKit
import GameplayKit
class GraphNode: GKGraphNode2D {
override func cost(to node: GKGraphNode) -> Float {
if let fromNode = self as? DoorGraphNode {
if let toNode = node as? DoorGraphNode {
if fromNode.complement == toNode {
return 0.0
}
}
}
return self.cost(to: node)
}
}
这样,当我调用 barrierGraph.findPath(from: startNode, to: targetNode) 时,理论上 GameplayKit 应该在调用 costToNode: 两个连接(补)紫色(DoorGraphNode)节点之间的方法时收到 0.0。
问题
但在实践中,我得到一个 EXC_BAD_ACCESS 错误,控制台中没有详细信息:
我不认为我在逻辑上做错了什么。你知道为什么会这样吗?