Implement movement range visualization and refine unit movement logic
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
extends CharacterBody2D
|
||||
|
||||
@export var unitData = {
|
||||
@export var unitData: Dictionary[String, Variant] = {
|
||||
"MoveRange": 5,
|
||||
"MoveRangeVi": Vector2i(5, 5),
|
||||
"MoveRangeV": Vector2(5, 5),
|
||||
@@ -11,9 +11,14 @@ var grid: AStarGrid2D
|
||||
var currentCell: Vector2i
|
||||
var currentPoint: int
|
||||
|
||||
var moveGrid: AStarGrid2D
|
||||
|
||||
var selected: bool:
|
||||
set(v):
|
||||
selected = v; $PathPrev.visible = selected; if selected: MapGlobal.SetRegion(calculateMovementRegion())
|
||||
selected = v;
|
||||
$PathPrev.visible = selected;
|
||||
if selected: setMoveGrid();
|
||||
# if selected: MapGlobal.SetRegion(calculateMovementRegion())
|
||||
var moving: bool:
|
||||
set(v):
|
||||
moving = v; $PathPrev.visible = not moving; set_physics_process(moving)
|
||||
@@ -32,6 +37,16 @@ func setup(_grid: AStarGrid2D):
|
||||
grid = _grid
|
||||
currentCell = pos_to_cell(global_position)
|
||||
targetCell = currentCell
|
||||
setMoveGrid()
|
||||
|
||||
func reset(pos: Vector2):
|
||||
stopMove()
|
||||
global_position = pos
|
||||
currentCell = pos_to_cell(global_position)
|
||||
targetCell = currentCell
|
||||
movePts = []
|
||||
$PathPrev.points = movePts
|
||||
currentPoint = 0
|
||||
|
||||
func pos_to_cell(pos: Vector2):
|
||||
return pos / Vector2(MapGlobal.getData()["cellSize"])
|
||||
@@ -44,6 +59,7 @@ func _input(event: InputEvent) -> void:
|
||||
func setTarget(target: Vector2i):
|
||||
if !selected: return
|
||||
if moving: return
|
||||
if currentCell.distance_to(target) > unitData["MoveRange"]: return
|
||||
if target != targetCell:
|
||||
print("Setting target: ")
|
||||
movePts = MapGlobal.GetGrid().get_point_path(currentCell, target)
|
||||
@@ -56,6 +72,10 @@ func setTarget(target: Vector2i):
|
||||
func startMove():
|
||||
if movePts.is_empty(): return
|
||||
currentPoint = 0; moving = true
|
||||
|
||||
func stopMove():
|
||||
if !moving: return
|
||||
moving = false
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if currentPoint == movePts.size() - 1:
|
||||
@@ -64,7 +84,7 @@ func _physics_process(delta: float) -> void:
|
||||
currentCell = pos_to_cell(global_position)
|
||||
$PathPrev.points = [];
|
||||
moving = false; MoveFinished.emit();
|
||||
MapGlobal.SetRegion(calculateMovementRegion(), -unitData["MoveRangeVi"])
|
||||
#MapGlobal.SetRegion(calculateMovementRegion(), -unitData["MoveRangeVi"])
|
||||
|
||||
else:
|
||||
var direction = (movePts[currentPoint+1] - movePts[currentPoint]).normalized()
|
||||
@@ -80,6 +100,15 @@ func selectUnit(cell: Vector2i):
|
||||
else:
|
||||
selected = false
|
||||
|
||||
func calculateMovementRegion():
|
||||
var region := Rect2i(pos_to_cell(global_position - unitData["MoveRangeV"]), unitData["MoveRangeVi"] * 2)
|
||||
return region
|
||||
func setMoveGrid():
|
||||
if not grid: return
|
||||
moveGrid = grid
|
||||
|
||||
# [moveRange]-tiles in each direction + center
|
||||
var gridSize = unitData["MoveRange"] * 2 + 1
|
||||
# moveGrid.set_size(Vector2i(gridSize, gridSize))
|
||||
moveGrid.region = (Rect2i(global_position, Vector2i(gridSize, gridSize)))
|
||||
moveGrid.offset = unitData["MoveRangeV"]
|
||||
|
||||
func GetMoveGrid() -> AStarGrid2D:
|
||||
return moveGrid
|
||||
Reference in New Issue
Block a user