Implement movement range visualization and refine unit movement logic
This commit is contained in:
@@ -2,23 +2,65 @@ extends Control
|
||||
|
||||
var grid: AStarGrid2D:
|
||||
set(v): grid = v; queue_redraw()
|
||||
var unit_grid: AStarGrid2D:
|
||||
set(v): unit_grid = v; queue_redraw()
|
||||
|
||||
@export var show_grid_display: bool:
|
||||
set(v): show_grid_display = v; queue_redraw()
|
||||
@export var show_move_range: bool:
|
||||
set(v): show_move_range = v; queue_redraw()
|
||||
|
||||
func toggle_grid_display(on: bool):
|
||||
grid = MapGlobal.GetGrid()
|
||||
show_grid_display = on
|
||||
|
||||
func toggle_move_range(on: bool):
|
||||
unit_grid = get_parent().get_parent().get_node("Player").GetMoveGrid()
|
||||
show_move_range = on
|
||||
|
||||
func getNewGrid():
|
||||
grid = MapGlobal.GetGrid()
|
||||
|
||||
func drawMoveRange():
|
||||
var walkableCells: Array[Vector2] = []
|
||||
var activeUnit = get_parent().get_parent().get_node("Player")
|
||||
var unitCellPosition = activeUnit.pos_to_cell(activeUnit.global_position)
|
||||
var unitRange = activeUnit.unitData["MoveRange"]
|
||||
|
||||
# max right, down, left, up
|
||||
for x in range(unitCellPosition.x, unitCellPosition.x + unitRange): # right +x
|
||||
walkableCells.append(Vector2(x, unitCellPosition.y))
|
||||
for y in range(unitCellPosition.y, unitCellPosition.y + unitRange): # down +y
|
||||
walkableCells.append(Vector2(unitCellPosition.x, y))
|
||||
for x in range(unitCellPosition.x, unitCellPosition.x - unitRange, -1): # left -x
|
||||
walkableCells.append(Vector2(x, unitCellPosition.y))
|
||||
for y in range(unitCellPosition.x, unitCellPosition.y - unitRange, -1): # up -y
|
||||
walkableCells.append(Vector2(unitCellPosition.x, y))
|
||||
|
||||
# diagonals?
|
||||
for x in unit_grid.region.size.x:
|
||||
for y in unit_grid.region.size.y:
|
||||
var p = Vector2(x + unit_grid.region.position.x, y + unit_grid.region.position.y)
|
||||
var col = Color(1,0,0,0.3) if unit_grid.is_point_solid(p) else Color(0,1,0,0.3)
|
||||
draw_rect(Rect2(p*unit_grid.cell_size, unit_grid.cell_size), col)
|
||||
|
||||
for cell in walkableCells:
|
||||
draw_rect(Rect2(cell*grid.cell_size, grid.cell_size), Color(0, 0, 1, 0.5))
|
||||
|
||||
func _draw():
|
||||
if not grid or not show_grid_display: return
|
||||
if unit_grid and show_move_range:
|
||||
drawMoveRange()
|
||||
|
||||
if grid and show_grid_display:
|
||||
drawNavigationGrid()
|
||||
|
||||
func drawNavigationGrid():
|
||||
for x in grid.region.size.x:
|
||||
for y in grid.region.size.y:
|
||||
var p = Vector2(x + grid.region.position.x, y + grid.region.position.y)
|
||||
var col = Color(1,0,0,0.3) if grid.is_point_solid(p) else Color(0,1,0,0.3)
|
||||
var p := Vector2(x + grid.region.position.x, y + grid.region.position.y)
|
||||
var col := Color(1,0,0,0.3) if grid.is_point_solid(p) else Color(0,1,0,0.3)
|
||||
draw_rect(Rect2(p*grid.cell_size, grid.cell_size), col)
|
||||
|
||||
|
||||
|
||||
func _on_player_move_finished() -> void:
|
||||
|
||||
Reference in New Issue
Block a user