GamePlayKit找到移动精灵的路径



我希望一个精灵跟随玩家,我试图通过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()
        }
    }

在此块中的"我的游戏"的更新功能中调用此函数:

if enemy.checkCircularIntersection(player: player, node: enemy, radius: 40){
     print("Enemy is close to player")
     enemy.update(playerPos: player.position)
}

checkCircularIntersection功能仅在玩家靠近敌人的情况下检查。

我的问题是敌人跟随球员,但是当玩家移动时,敌人移动到了球员以前的位置,然后停止了一秒钟,然后再次移动到玩家站立的地步。但是玩家已经被移开了。
有没有办法让敌人永久跟随球员并避免障碍而不会停止?

您的代码专门防止再次移动,直到现有移动完成为止。

guard !moving else { return }
moving = true

如果要使用路径,则必须重新计算和重新申请路径移动以说明目标的运动。

但是,为了实现您的目标,路径不是最合适的游戏套装工具。Gkagents是专门为这种事情设计的。它需要重大重构您的代码,但要看一下代理,目标和行为。

最新更新