Trying new stuff with the camera and grid. I want to be able to move a unit but there is a problem with the grid at the moment. I am now trying to implement a new way of handling the camera, maybe then I can move on to moving units...
This commit is contained in:
75
Scenes/Main/cursor.gd
Normal file
75
Scenes/Main/cursor.gd
Normal file
@@ -0,0 +1,75 @@
|
||||
## Player-controlled cursor. Allows them to navigate the game grid, select units, and move them.
|
||||
## Supports both keyboard and mouse (or touch) input.
|
||||
@tool
|
||||
class_name Cursor
|
||||
extends Node2D
|
||||
|
||||
## Emitted when clicking on the currently hovered cell or when pressing "ui_accept".
|
||||
signal accept_pressed(cell)
|
||||
## Emitted when the cursor moved to a new cell.
|
||||
signal moved(new_cell)
|
||||
|
||||
## Grid resource, giving the node access to the grid size, and more.
|
||||
@export var grid: Resource
|
||||
## Time before the cursor can move again in seconds.
|
||||
@export var ui_cooldown := 0.1
|
||||
|
||||
## Coordinates of the current cell the cursor is hovering.
|
||||
var cell := Vector2.ZERO:
|
||||
set(value):
|
||||
print("Setting cell to: ", value)
|
||||
# We first clamp the cell coordinates and ensure that we aren't
|
||||
# trying to move outside the grid boundaries
|
||||
var new_cell: Vector2 = grid.clamp(value)
|
||||
print("New cell: ", new_cell)
|
||||
if new_cell.is_equal_approx(cell):
|
||||
return
|
||||
|
||||
cell = new_cell
|
||||
print("Cell is ", cell)
|
||||
# If we move to a new cell, we update the cursor's position, emit
|
||||
# a signal, and start the cooldown timer that will limit the rate
|
||||
# at which the cursor moves when we keep the direction key held
|
||||
# down
|
||||
position = grid.calculateMapPosition(cell)
|
||||
print("Position is ", position)
|
||||
emit_signal("moved", cell)
|
||||
_timer.start()
|
||||
|
||||
@onready var _timer: Timer = $Timer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_timer.wait_time = ui_cooldown
|
||||
position = grid.calculateMapPosition(cell)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
# Navigating cells with the mouse.
|
||||
if event is InputEventMouseMotion:
|
||||
cell = grid.calculateGridCoordinates(event.position)
|
||||
# Trying to select something in a cell.
|
||||
elif event.is_action_pressed("Select") or event.is_action_pressed("ui_accept"):
|
||||
emit_signal("accept_pressed", cell)
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
var should_move := event.is_pressed()
|
||||
if event.is_echo():
|
||||
should_move = should_move and _timer.is_stopped()
|
||||
|
||||
if not should_move:
|
||||
return
|
||||
|
||||
# Moves the cursor by one grid cell.
|
||||
if event.is_action("ui_right"):
|
||||
cell += Vector2.RIGHT
|
||||
elif event.is_action("ui_up"):
|
||||
cell += Vector2.UP
|
||||
elif event.is_action("ui_left"):
|
||||
cell += Vector2.LEFT
|
||||
elif event.is_action("ui_down"):
|
||||
cell += Vector2.DOWN
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
draw_rect(Rect2(-grid.cellSize / 2, grid.cellSize), Color.ALICE_BLUE, false, 2.0)
|
||||
Reference in New Issue
Block a user