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)