스프라이트가 플레이어를 따라 가기를 원하며 GameplayKit의 Pathfinding으로 이것을 시도했습니다. 이것은 작동하지만 문제가 있습니다.GameplayKit 움직이는 스프라이트에 대한 경로 찾기
func moveEnemy(to playerPos: CGPoint){
guard !moving else { return }
moving = true
let startNode = GKGraphNode2D(point: float2(Float(self.position.x), Float(self.position.y)))
let endNode = GKGraphNode2D(point: float2(Float(playerPos.x), Float(playerPos.y)))
PhysicsHelper.graph.connectUsingObstacles(node: startNode)
PhysicsHelper.graph.connectUsingObstacles(node: endNode)
let path = PhysicsHelper.graph.findPath(from: startNode, to: endNode)
guard path.count > 0 else{ return }
var actions = [SKAction]()
for node in path{
if let point2d = node as? GKGraphNode2D{
let point = CGPoint(x:CGFloat(point2d.position.x) , y:CGFloat(point2d.position.y))
let action = SKAction.move(to: point, duration: 1)
actions.append(action)
}
}
let seq = SKAction.sequence(actions)
self.run(seq) {
self.moving = false
}
}
이이 블록 내 원수의 다른 함수에서 호출됩니다 :
case .follow:
if allowMovement{
if self.action(forKey: "Hurt") == nil{
// orientEnemy(to: playerPos)
moveEnemy(to: playerPos)
// animateWalk()
}
}
이 함수가 호출되고 난 다음 코드로 플레이어 스프라이트에 적 스프라이트의 경로를 가져올 수 이 블록 내 GameScene의 업데이트 기능 : 만 검사
if enemy.checkCircularIntersection(player: player, node: enemy, radius: 40){
print("Enemy is close to player")
enemy.update(playerPos: player.position)
}
checkCircularIntersection
기능, 플레이어가 적을 가까이합니다.
내 문제는 적이 플레이어를 따라하지만, 플레이어가 움직이면 적군이 플레이어가 앞에 서있는 지점으로 이동 한 다음 잠시 멈추고 플레이어가 서 있던 지점으로 다시 이동한다는 것입니다. 그러나 플레이어는 이미 이동되었습니다.
적을 영구적으로 따라 가게하고 멈추지 않고 장애물을 피할 수있는 방법이 있습니까?
내가 이해할 수없는 것은 적의 스프라이트가 1 초를 기다리는 이유입니다. 경로 계산을위한 함수는 GameScene의 update 메소드에 의해 호출됩니다. 따라서 적군이 길을 끝내면 기다리지 않고 새로운 길을 직접 걸어 가야합니다. 아니면 길 찾기가 새로운 길을 찾기 위해 오랜 시간을 필요로합니까? 하지만 힌트를 주셔서 감사합니다! GameplayKit 사용 방법에 대해 자세히 살펴 보겠습니다. – Marcel