Files
autgame/games/juggleboard/scripts/ui/lock_marble_button.gd
T

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)