Files
chaussette.sale/scenes/pathFollow.gd
Thomas dcb63f7fe0 Les voitures ont un meilleur gps
Les voiture maintenant suivent des coordonnées fournies par un AStarGrid2D
au lieu de bétement faire une diagonale vers le prochain point du lapin
ce qui fait que, maintenant elle ne peuvent plus vraiment monter sur les
troitoirs car ils ne font pas partis du calque de navigation.
2025-02-25 11:37:45 +01:00

60 lines
2.0 KiB
GDScript

class_name NPCCar
extends PathFollow2D
@export var car : Car
@export var distanceMax = 100
var astar_grid: AStarGrid2D
var toFollow: Array[Vector2i]
@export var world: TileMapLayer
var CARLAYER = 1
func _ready() -> void:
astar_grid = AStarGrid2D.new()
astar_grid.region = world.get_used_rect()
astar_grid.cell_size = Vector2(48, 48)
astar_grid.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE
astar_grid.update()
# only take into account the tiles that are marked with a navigation layer for cars
for x in world.get_used_rect().size.x:
for y in world.get_used_rect().size.y:
var tile_position = Vector2(
x + world.get_used_rect().position.x,
y + world.get_used_rect().position.y,
)
var tile_data = world.get_cell_tile_data(tile_position)
if tile_data == null or tile_data.get_navigation_polygon(CARLAYER) == null:
astar_grid.set_point_solid(tile_position)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if car == null:
return
# make the wanted position on the track move ahead by a certain amount
if position.distance_to(car.position) < distanceMax and (toFollow == null or toFollow.is_empty()):
progress += 200
# compute the new navigation points the car should follow
var points = astar_grid.get_id_path(
world.local_to_map(world.to_local(car.global_position)),
world.local_to_map(world.to_local(global_position))
).slice(1)
if !points.is_empty():
toFollow = points
if OS.is_debug_build():
$Label.text = (
"position "+str(global_position)+
"\n, map position "+ str(world.local_to_map(world.to_local(global_position)))+
"\npoint to follow "+str(toFollow)+
"\n world position" + str(world.global_position)
)
if !toFollow.is_empty():
if world.local_to_map(world.to_local(car.global_position)) == toFollow.front():
toFollow.pop_front()
if !toFollow.is_empty():
car.moveTo(world.to_global(world.map_to_local(toFollow.front())));