74 lines
2.7 KiB
GDScript
74 lines
2.7 KiB
GDScript
class_name LockMarbleButton
|
|
extends Control
|
|
## Biglia interattiva del lock adulto.
|
|
|
|
signal chosen(color_name: String)
|
|
|
|
var color_name := ""
|
|
var ball_color := Color.WHITE
|
|
var radius := 47.0
|
|
var hovered := false
|
|
var held := false
|
|
var veins: Array[PackedVector2Array] = []
|
|
|
|
|
|
func setup(name: String, color: Color) -> void:
|
|
color_name = name
|
|
ball_color = color
|
|
custom_minimum_size = Vector2(108, 108)
|
|
mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
|
|
mouse_entered.connect(func(): hovered = true; queue_redraw())
|
|
mouse_exited.connect(func(): hovered = false; held = false; queue_redraw())
|
|
_generate_veins()
|
|
queue_redraw()
|
|
|
|
|
|
func _gui_input(event: InputEvent) -> void:
|
|
# Il touch emulato produce già MouseButton: gestire anche ScreenTouch raddoppierebbe l'evento.
|
|
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
|
|
held = event.pressed
|
|
queue_redraw()
|
|
if not event.pressed:
|
|
chosen.emit(color_name)
|
|
accept_event()
|
|
|
|
|
|
func _draw() -> void:
|
|
var center := size * 0.5 + Vector2(0, 2 if held else 0)
|
|
var draw_radius := radius * (0.96 if held else (1.03 if hovered else 1.0))
|
|
draw_circle(center + Vector2(0, 6), draw_radius, Color(0, 0, 0, 0.28))
|
|
draw_circle(center, draw_radius, ball_color)
|
|
draw_circle(center + Vector2(draw_radius * 0.18, draw_radius * 0.22), draw_radius * 0.92, Color(0, 0, 0, 0.16))
|
|
draw_circle(center - Vector2(draw_radius * 0.18, draw_radius * 0.22), draw_radius * 0.92, Color(1, 1, 1, 0.20))
|
|
var vein_color := ball_color.darkened(0.42)
|
|
vein_color.a = 0.22
|
|
var soft_color := ball_color.darkened(0.28)
|
|
soft_color.a = 0.13
|
|
for vein in veins:
|
|
var points := PackedVector2Array()
|
|
for point in vein:
|
|
points.append(center + point * (draw_radius / radius))
|
|
draw_polyline(points, soft_color, draw_radius * 0.095, true)
|
|
draw_polyline(points, vein_color, draw_radius * 0.045, true)
|
|
draw_arc(center, draw_radius, 0.0, TAU, 56, Color(0.1, 0.1, 0.1, 0.92), 4.0, true)
|
|
draw_circle(center - Vector2(draw_radius * 0.30, draw_radius * 0.34), draw_radius * 0.16, Color(1, 1, 1, 0.86))
|
|
if hovered:
|
|
draw_arc(center, draw_radius + 4.0, 0.0, TAU, 56, Color(1, 1, 1, 0.75), 2.0, true)
|
|
|
|
|
|
func _generate_veins() -> void:
|
|
var rng := RandomNumberGenerator.new()
|
|
rng.seed = hash(color_name)
|
|
for index in 5:
|
|
var points := PackedVector2Array()
|
|
var y_base := rng.randf_range(-0.55, 0.55) * radius
|
|
var phase := rng.randf_range(0.0, TAU)
|
|
var x_start := rng.randf_range(-0.78, -0.35) * radius
|
|
var x_end := rng.randf_range(0.35, 0.78) * radius
|
|
for point_index in 13:
|
|
var factor := float(point_index) / 12.0
|
|
var x := lerpf(x_start, x_end, factor)
|
|
var y := y_base + sin(factor * TAU * 1.2 + phase) * radius * 0.13
|
|
points.append(Vector2(x, y))
|
|
veins.append(points)
|