godot-mota/scripts/NavigationTileMap.gd

65 lines
1.8 KiB
GDScript

tool
extends TileMap
class_name NavigationTileMap
var astar : AStar2D = AStar2D.new()
# 遮挡物
export(NodePath) var collsion_tilemap_path : NodePath
# 初始化tilemap配置
func _init():
self.tile_set = load("res://images/mota_tileset.tres")
self.cell_size = Vector2(32,32)
# 初始化node和edge
func _ready():
var cells := get_cells()
init_nodes(cells)
init_edges(cells)
# 初始化nodes
func init_nodes(cells:Array):
for index in range(cells.size()):
var cell_position = cells[index] * cell_size
cell_position.x += 16
cell_position.y += 16
astar.add_point(index, cell_position)
# 初始化edge
func init_edges(cells:Array):
for index in range(cells.size()):
var cell = cells[index]
#left
var left_cell_index = cells.find(Vector2(cell.x - 1,cell.y))
if left_cell_index != -1:
astar.connect_points(index,left_cell_index)
#right
var right_cell_index = cells.find(Vector2(cell.x + 1,cell.y))
if right_cell_index != -1:
astar.connect_points(index,right_cell_index)
#up
var up_cell_index = cells.find(Vector2(cell.x,cell.y - 1))
if up_cell_index != -1:
astar.connect_points(index,up_cell_index)
#down
var down_cell_index = cells.find(Vector2(cell.x,cell.y + 1))
if down_cell_index != -1:
astar.connect_points(index,down_cell_index)
# 返回显示的道路需要去除被遮挡的道路
func get_cells() -> Array:
var cells = get_used_cells()
if not collsion_tilemap_path.is_empty():
var collsion_tilemap = get_node(collsion_tilemap_path) as TileMap
print("collsion_tilemap ", collsion_tilemap)
var collsion_cells = collsion_tilemap.get_used_cells()
for collsion_cell in collsion_cells:
var index = cells.find(collsion_cell)
if index != -1:
print("index ",index)
print("cell ",cells[index])
cells.remove(index)
return cells