gpt4 book ai didi

swift - GameplayKit 找到移动 Sprite 的路径

转载 作者:行者123 更新时间:2023-11-28 15:11:20 25 4
gpt4 key购买 nike

我想要一个 Sprite 跟随玩家,我试图通过 GameplayKit 的 Pathfinding 来实现这一点。这是可行的,但是有问题。我使用以下代码获取从敌人 Sprite 到玩家 Sprite 的路径:

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
}
}

这是在这个 block 中我的敌人的另一个函数中调用的:

case .follow:
if allowMovement{
if self.action(forKey: "Hurt") == nil{
// orientEnemy(to: playerPos)
moveEnemy(to: playerPos)
// animateWalk()
}
}

并且在这个 block 中我的 GameScene 的更新函数中调用了这个函数:

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

如果您想使用路径,则必须定期重新计算并重新应用路径移动以考虑目标的移动。

但是,要实现您的目标,Paths 并不是最适合使用的 GameKit 工具。 GKAgents 是专门为这种事情设计的。这将需要对您的代码进行重大重构,但请查看 Agents, Goals and Behaviours .

关于swift - GameplayKit 找到移动 Sprite 的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47584452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com