СитуацияВызов costToNode: в подклассы GKGraphNode2D с GameplayKit
Я использую 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
}
}
Затем я подклассы все узлы GKGraphNode2D, которые будут добавлены к GKObstaclesGraph в 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)
}
}
Таким образом, когда я называю препятствиеGraph.findPath (from: startNode, to: targetNode), тогда GameplayKit теоретически получит 0.0, когда он вызывает метод costToNode: между двумя связанными (дополняющими) фиолетовыми (DoorGraphNode) узлами.
Проблема
На практике, однако, я получаю ошибку EXC_BAD_ACCESS без деталей в консоли:
Я не думаю, что я делаю что-то неправильно логика мудр. Вы не знаете, почему это происходит?
Спасибо за ваш ответ! Я забыл упомянуть, что ранее я попробовал «super.cost (to: node)», а также «self.cost (to: node)» с той же результирующей ошибкой. Вы знаете, в чем проблема? –
Вы определенно должны использовать 'super.cost (to: node)'. Кроме того, странно отличать 'GraphNode' как' DoorGraphNode'. Было бы лучше добавить еще одно переопределение стоимости (to: node) в классе 'DoorGraphNode'. –
Переопределенная 'cost (to: node)' в классе 'DoorGraphNode' никогда не вызывается. Я думаю, это связано с тем, что не все узлы в графе имеют тип 'DoorGraphNode' (т. Е. Начальные и целевые точки являются« GraphNode », а другие препятствия, избегающие узлов, предположительно« GKGraphNode2D »). Это отстой, что до сих пор мало доступно о GameplayKit. –