59 lines
2.0 KiB
GDScript
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)
|