Reorganized input
This commit is contained in:
@@ -5,12 +5,23 @@ const SPEED = 192.0
|
||||
@export var dl_map: CombatMap
|
||||
|
||||
signal combat_requested(attacker: Unit, defender: Unit)
|
||||
signal mouse_grid_changed(coords: Vector2i)
|
||||
signal camera_drag(delta: Vector2)
|
||||
|
||||
var input_disabled := false
|
||||
|
||||
var _selected_unit: Unit = null
|
||||
var _target_pos: Vector2
|
||||
var _goal_pos: Vector2
|
||||
var _moving := false
|
||||
|
||||
var _left_pending := false
|
||||
var _drag_start := Vector2.ZERO
|
||||
var _dragging := false
|
||||
var _current_grid_coords := Vector2i(-99999, -99999)
|
||||
|
||||
const DRAG_THRESHOLD := 8.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
for unit: Unit in get_tree().get_nodes_in_group("units"):
|
||||
@@ -30,23 +41,55 @@ func _on_unit_died(unit: Unit) -> void:
|
||||
_moving = false
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseButton and not event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
|
||||
var world_pos: Vector2 = get_viewport().get_canvas_transform().affine_inverse() * event.position
|
||||
var clicked_unit := _get_unit_at(world_pos)
|
||||
func _process(_delta: float) -> void:
|
||||
if input_disabled:
|
||||
return
|
||||
var mouse_pos := get_viewport().get_canvas_transform().affine_inverse() * get_viewport().get_mouse_position()
|
||||
var coords := dl_map.world_to_coords(mouse_pos)
|
||||
if coords != _current_grid_coords:
|
||||
_current_grid_coords = coords
|
||||
mouse_grid_changed.emit(coords)
|
||||
|
||||
if clicked_unit:
|
||||
if _selected_unit and clicked_unit != _selected_unit and _selected_unit.is_alive() and clicked_unit.is_alive():
|
||||
combat_requested.emit(_selected_unit, clicked_unit)
|
||||
else:
|
||||
_select_unit(clicked_unit)
|
||||
get_viewport().set_input_as_handled()
|
||||
elif _selected_unit:
|
||||
var snapped_pos := dl_map.snap_to_grid(world_pos)
|
||||
var grid_coords := dl_map.world_to_coords(world_pos)
|
||||
if dl_map.is_wall(grid_coords):
|
||||
return
|
||||
_goal_pos = snapped_pos
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if input_disabled:
|
||||
return
|
||||
|
||||
if event is InputEventMouseButton:
|
||||
match event.button_index:
|
||||
MOUSE_BUTTON_LEFT:
|
||||
if event.pressed:
|
||||
_left_pending = true
|
||||
_drag_start = event.position
|
||||
else:
|
||||
if _dragging:
|
||||
_dragging = false
|
||||
_left_pending = false
|
||||
Input.set_default_cursor_shape(Input.CURSOR_ARROW)
|
||||
get_viewport().set_input_as_handled()
|
||||
else:
|
||||
_left_pending = false
|
||||
_handle_left_click(event.position)
|
||||
MOUSE_BUTTON_MIDDLE:
|
||||
if event.pressed:
|
||||
_dragging = true
|
||||
_drag_start = event.position
|
||||
Input.set_default_cursor_shape(Input.CURSOR_DRAG)
|
||||
else:
|
||||
_dragging = false
|
||||
Input.set_default_cursor_shape(Input.CURSOR_ARROW)
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
elif event is InputEventMouseMotion:
|
||||
if _left_pending and not _dragging:
|
||||
if event.position.distance_to(_drag_start) >= DRAG_THRESHOLD:
|
||||
_dragging = true
|
||||
_left_pending = false
|
||||
Input.set_default_cursor_shape(Input.CURSOR_DRAG)
|
||||
if _dragging:
|
||||
var delta: Vector2 = _drag_start - event.position
|
||||
_drag_start = event.position
|
||||
camera_drag.emit(delta)
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
|
||||
@@ -83,6 +126,25 @@ func _physics_process(delta: float) -> void:
|
||||
_moving = true
|
||||
|
||||
|
||||
func _handle_left_click(screen_pos: Vector2) -> void:
|
||||
var world_pos: Vector2 = get_viewport().get_canvas_transform().affine_inverse() * screen_pos
|
||||
var clicked_unit := _get_unit_at(world_pos)
|
||||
|
||||
if clicked_unit:
|
||||
if _selected_unit and clicked_unit != _selected_unit and _selected_unit.is_alive() and clicked_unit.is_alive():
|
||||
combat_requested.emit(_selected_unit, clicked_unit)
|
||||
else:
|
||||
_select_unit(clicked_unit)
|
||||
get_viewport().set_input_as_handled()
|
||||
elif _selected_unit:
|
||||
var snapped_pos := dl_map.snap_to_grid(world_pos)
|
||||
var grid_coords := dl_map.world_to_coords(world_pos)
|
||||
if dl_map.is_wall(grid_coords):
|
||||
return
|
||||
_goal_pos = snapped_pos
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
|
||||
func _select_unit(unit: Unit) -> void:
|
||||
if _selected_unit:
|
||||
_selected_unit.set_selected(false)
|
||||
|
||||
Reference in New Issue
Block a user