1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| extends TileMap
enum Tile { OBSTACLE, START_POINT, END_POINT }
const CELL_SIZE = Vector2i(64, 64)
const BASE_LINE_WIDTH = 3.0 const DRAW_COLOR = Color.WHITE * Color(1, 1, 1, 0.5)
var _astar = AStarGrid2D.new()
var _start_point = Vector2i() var _end_point = Vector2i()
var _path = PackedVector2Array()
func _ready(): _astar.region = Rect2i(0, 0, 18, 10) _astar.cell_size = CELL_SIZE _astar.offset = CELL_SIZE * 0.5 _astar.default_compute_heuristic = AStarGrid2D.HEURISTIC_MANHATTAN _astar.default_estimate_heuristic = AStarGrid2D.HEURISTIC_MANHATTAN _astar.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER _astar.update()
for i in range(_astar.region.position.x, _astar.region.end.x): for j in range(_astar.region.position.y, _astar.region.end.y): var pos = Vector2i(i, j) if get_cell_source_id(0, pos) == Tile.OBSTACLE: _astar.set_point_solid(pos)
func _draw(): if _path.is_empty(): return
var last_point = _path[0] for index in range(1, len(_path)): var current_point = _path[index] draw_line(last_point, current_point, DRAW_COLOR, BASE_LINE_WIDTH, true) draw_circle(current_point, BASE_LINE_WIDTH * 2.0, DRAW_COLOR) last_point = current_point
func round_local_position(local_position): return map_to_local(local_to_map(local_position))
func is_point_walkable(local_position): var map_position = local_to_map(local_position) if _astar.is_in_boundsv(map_position): return not _astar.is_point_solid(map_position) return false
func clear_path(): if not _path.is_empty(): _path.clear() erase_cell(0, _start_point) erase_cell(0, _end_point) queue_redraw()
func find_path(local_start_point, local_end_point): clear_path() _start_point = local_to_map(local_start_point) _end_point = local_to_map(local_end_point)
_path = _astar.get_point_path(_start_point, _end_point)
if not _path.is_empty(): set_cell(0, _start_point, 0, Vector2i(Tile.START_POINT, 0)) set_cell(0, _end_point, 0, Vector2i(Tile.END_POINT, 0))
queue_redraw()
return _path.duplicate()
|