Итак, я пытался реализовать поиск пути в моей игре 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)
...
}
Кажется, это работает нормально, когда я только касаюсь экрана один раз, но когда я касаюсь и удерживаю его, он движется намного медленнее, и спрайт начинает мерцать. Я пытался исправить это в течение часа, и я просто понятия не имею, что вызывает это странное поведение.
Спасибо за вашу помощь!