2017-11-30 16 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秒間停止し、プレイヤーが立ったポイントに再び移動します。しかし、プレーヤーはすでに離れています。
敵をプレイヤーに恒久的に追従させ、止めることなく障害物を回避する方法はありますか?

答えて

1

あなたのコードは、既存の移動が完了するまで、特に移動を控えます。あなたがパスを使用する場合は

guard !moving else { return } 
moving = true 

あなたは、ターゲットの動きを説明するために、定期的にパスの動きを再計算し、再適用する必要があります。

しかし、目的を達成するために、パスは、使用するのに最適なGameKitツールではありません。 GKAgentsは、そのようなもののために特別に設計されています。コードの大幅なリファクタリングが必要ですが、Agents, Goals and Behavioursをご覧ください。

+0

私が理解できないことは、敵スプライトが1秒間待っている理由です。パスを計算する関数は、GameSceneのupdateメソッドによって呼び出されます。だから、敵が道を終えると、敵は待たずに新しい道を直接歩くべきです。あるいは、新しい経路を見つけるために長い経路が必要なのでしょうか?しかし、ヒントのおかげで!私はGameplayKitの使い方を詳しく見ていきます。 – Marcel

関連する問題