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