Refactor Godot architecture into AppShell, modular menus and game domains
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user