hadean-godot/Scripts/Highlight.gd

59 lines
2.0 KiB
GDScript

extends Node2D
@onready var grid: Grid = $/root/Root/Grid
@export var highlight_color: Color = Color(1, 1, 1, 0.2)
@onready var d_pos: Rect2 = grid.quantize(get_local_mouse_position(), Vector2i.ONE)
@onready var c_pos: Rect2 = d_pos
@onready var d_opacity = 1.0 if grid.contains_world_pos(get_local_mouse_position()) else 0.0
@onready var c_opacity = 0.0
#eventually, replace this weird shit with an array of old rects that are fading out
#let them fade out, and just remove them. have a method to abandon the current box
#and start a new one that just follows the normal box-booting procedure.
#if you're not in the grid, it simply wont be created yet. have to have a has_box prop
#or something like that. but this is good enough for now
func _lerp_opacity(c: Color, t: float) -> Color:
return Color(c.r, c.g, c.b, c.a * t)
func _process(delta):
queue_redraw()
var a_center = c_pos.get_center()
if c_opacity >= 0.01:
var b_center = d_pos.get_center()
# i know its not right but stfu
var n_center = lerp(a_center, b_center, delta * 60)
var a_size = c_pos.size
var b_size = d_pos.size
var n_size: Vector2
if a_size.length_squared() > b_size.length_squared():
n_size = lerp(a_size, b_size, delta * 20)
else:
#getting bigger needs to be ffaster because it looks nice but also lerping
#bigger makes it last longer at the very end
n_size = lerp(a_size, b_size, delta * 60)
var n_pos = n_center - n_size / 2
c_pos = Rect2(n_pos, n_size)
else:
c_pos = Rect2(d_pos)
var mouse = get_local_mouse_position()
if grid.contains_world_pos(mouse) and not grid.left_dragging:
d_pos = grid.quantize_on_objects(get_local_mouse_position())
if grid.contains_world_pos(a_center):
d_opacity = 1.0
else:
d_opacity = 0.0
if d_opacity > c_opacity or grid.left_dragging:
c_opacity = lerp(c_opacity, d_opacity, delta * 30)
else:
c_opacity = lerp(c_opacity, d_opacity, delta * 3)
func _draw():
draw_rect(c_pos, _lerp_opacity(highlight_color, c_opacity), true)