2017-11-30 26 views
0

스프라이트가 플레이어를 따라 가기를 원하며 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

귀하의 코드는 기존 이동이 완료 될 때까지 특별히 움직이지 않도록합니다.

guard !moving else { return } 
moving = true 

경로를 사용하려면 대상 움직임을 고려하여 경로 이동을 다시 계산하고 다시 적용해야합니다.

그러나 목표를 달성하기 위해 경로는 사용할 수있는 가장 적합한 GameKit 도구가 아닙니다. GKAgents는 그런 종류의 일을 위해 특별히 설계되었습니다. 코드 리팩토링이 필요하지만 Agents, Goals and Behaviours을 살펴보십시오.

+0

내가 이해할 수없는 것은 적의 스프라이트가 1 초를 기다리는 이유입니다. 경로 계산을위한 함수는 GameScene의 update 메소드에 의해 호출됩니다. 따라서 적군이 길을 끝내면 기다리지 않고 새로운 길을 직접 걸어 가야합니다. 아니면 길 찾기가 새로운 길을 찾기 위해 오랜 시간을 필요로합니까? 하지만 힌트를 주셔서 감사합니다! GameplayKit 사용 방법에 대해 자세히 살펴 보겠습니다. – Marcel