2017-01-06 7 views
0

СитуацияВызов costToNode: в подклассы GKGraphNode2D с GameplayKit

Я использую GKObstacleGraph для первопрохождения на следующей карте: enter image description here

Оранжевые области являются препятствиями (GKPolygonObstacle), в то время как пурпурных точек и линий (GKGraphNode2D) и их соответствующие соединения, которые объект может использовать для телепортации через препятствия.

Все работает отлично и субъект находит правильный путь: enter image description here

Гол

То, что я думал, что было бы методологически правильно, чтобы установить стоимость между фиолетовыми узлами до 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 без деталей в консоли: enter image description here

Я не думаю, что я делаю что-то неправильно логика мудр. Вы не знаете, почему это происходит?

ответ

0

Линия 22 в классе GraphNode вызывает себя. Он должен называть своего родителя.

return super.cost(to: node) 
+0

Спасибо за ваш ответ! Я забыл упомянуть, что ранее я попробовал «super.cost (to: node)», а также «self.cost (to: node)» с той же результирующей ошибкой. Вы знаете, в чем проблема? –

+0

Вы определенно должны использовать 'super.cost (to: node)'. Кроме того, странно отличать 'GraphNode' как' DoorGraphNode'. Было бы лучше добавить еще одно переопределение стоимости (to: node) в классе 'DoorGraphNode'. –

+0

Переопределенная 'cost (to: node)' в классе 'DoorGraphNode' никогда не вызывается. Я думаю, это связано с тем, что не все узлы в графе имеют тип 'DoorGraphNode' (т. Е. Начальные и целевые точки являются« GraphNode », а другие препятствия, избегающие узлов, предположительно« GKGraphNode2D »). Это отстой, что до сих пор мало доступно о GameplayKit. –