Поиск пути с GameplayKit: Sprite ведет себя странно, когда я пытаюсь заставить его следовать за прикосновением - PullRequest
0 голосов
/ 12 июня 2019

Итак, я пытался реализовать поиск пути в моей игре SpriteKit (пользователь касается экрана, и спрайт пробирается к точке касания, избегая препятствий). Следующий код - это то, к чему я обратился (этот фрагмент находится в пользовательском классе SpriteNode, который я хочу переместить):

func move(location : CGPoint) {
    let obstacles = SKNode.obstacles(fromNodeBounds: self.scene!.children.filter({ (n) -> Bool in
        if (n.name ?? "" == "obstacle") {return true} else {return false}
    }))
    let graph = GKObstacleGraph.init(obstacles: obstacles, bufferRadius: 24)
    let startNode = GKGraphNode2D.init(point: float2(Float(self.position.x), Float(self.position.y)))
    let endNode = GKGraphNode2D.init(point: float2(Float(location.x), Float(location.y)))
    graph.connectUsingObstacles(node: startNode)
    graph.connectUsingObstacles(node: endNode)
    let path : [GKGraphNode] = graph.findPath(from: startNode, to: endNode)
    if (path.count <= 0) {return}
    var actions = [SKAction]()
    var bef = self.position
    for n in path {
        if let point2d = n as? GKGraphNode2D {
            let point = CGPoint(x: CGFloat(point2d.position.x), y: CGFloat(point2d.position.y))
            let moveAction = SKAction.move(to: point, duration: Double(distance(bef, point) * speed_multiplier))
            let rotateAction = SKAction.rotate(toAngle: angle(bef, point), duration: 0, shortestUnitArc: true)
            bef = point
            actions.append(rotateAction)
            actions.append(moveAction)
        }
    }
    let sequence = SKAction.sequence(actions)
    self.run(sequence)
}

я вызываю эту функцию с touchesMoved в моем классе игр:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    ...
    let location = ((touches.first as? UITouch)?.location(in: self))!
    ship.move(location: location)
    ...
}

Кажется, это работает нормально, когда я только касаюсь экрана один раз, но когда я касаюсь и удерживаю его, он движется намного медленнее, и спрайт начинает мерцать. Я пытался исправить это в течение часа, и я просто понятия не имею, что вызывает это странное поведение.

Спасибо за вашу помощь!

...