From 4d7aa698e39f9cf0fcb5730374dbbbb8cbd32035 Mon Sep 17 00:00:00 2001 From: enne2 Date: Tue, 18 Aug 2026 14:59:56 +0200 Subject: [PATCH] Board hand-drawn style: cream board, recessed gray lanes with sockets, glossy balls --- scripts/ball.gd | 18 +++++++++------- scripts/board.gd | 43 ++++++++++++++++++++++++++++++++++++++ scripts/main.gd | 48 +++++++++++++++---------------------------- scripts/target_dot.gd | 7 +++++-- 4 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 scripts/board.gd diff --git a/scripts/ball.gd b/scripts/ball.gd index ea1a57b..d6c3448 100644 --- a/scripts/ball.gd +++ b/scripts/ball.gd @@ -18,14 +18,18 @@ var _tween: Tween func _draw() -> void: - # ombra - draw_circle(Vector2(0, 5), radius, Color(0, 0, 0, 0.3)) - # corpo + # ombra a terra + draw_circle(Vector2(0, 6), radius, Color(0, 0, 0, 0.25)) + # corpo base draw_circle(Vector2.ZERO, radius, ball_color) - # bordo - draw_arc(Vector2.ZERO, radius, 0.0, TAU, 48, Color(0, 0, 0, 0.45), 3.0) - # riflesso - draw_circle(Vector2(-radius * 0.28, -radius * 0.32), radius * 0.18, Color(1, 1, 1, 0.55)) + # ombreggiatura inferiore-destra (profondità 3D) + draw_circle(Vector2(radius * 0.18, radius * 0.22), radius * 0.92, Color(0, 0, 0, 0.16)) + # luce superiore-sinistra + draw_circle(Vector2(-radius * 0.18, -radius * 0.22), radius * 0.92, Color(1, 1, 1, 0.2)) + # bordo nero spesso (stile china) + draw_arc(Vector2.ZERO, radius, 0.0, TAU, 48, Color(0.1, 0.1, 0.1, 0.9), 4.0) + # riflesso speculare + draw_circle(Vector2(-radius * 0.3, -radius * 0.34), radius * 0.16, Color(1, 1, 1, 0.85)) func setup(cn: String, c: Color, home: Vector2, left: Vector2, r: float) -> void: diff --git a/scripts/board.gd b/scripts/board.gd new file mode 100644 index 0000000..04a9fcf --- /dev/null +++ b/scripts/board.gd @@ -0,0 +1,43 @@ +extends Node2D +## Plancia in stile hand-drawn/sketch: sfondo chiaro, 5 corsie grigie con +## alloggiamenti circolari alle estremità (come il board di riferimento). + +const VIEW := Vector2(1280, 720) +const LANE_TOP := 210.0 +const LANE_GAP := 98.0 +const HOME_X := 1130.0 +const LEFT_X := 300.0 +const CHANNEL_H := 44.0 +const SOCKET_R := 46.0 + +const BG := Color("#f7f5f0") # tono carta +const FILL := Color("#b0b0b0") +const OUTLINE := Color(0.1, 0.1, 0.1, 0.85) + + +func _draw() -> void: + # sfondo plancia (tono carta) + draw_rect(Rect2(Vector2.ZERO, VIEW), BG) + # cornice esterna + draw_rect(Rect2(Vector2.ZERO, VIEW), Color(0, 0, 0, 0.12), false, 3.0) + for i in 5: + _draw_lane(LANE_TOP + i * LANE_GAP) + + +func _draw_lane(y: float) -> void: + # canale centrale + var ch := Rect2(LEFT_X, y - CHANNEL_H / 2.0, HOME_X - LEFT_X, CHANNEL_H) + draw_rect(ch, FILL) + draw_rect(ch, OUTLINE, false, 3.0) + # ombra interna in alto (scanalatura incassata) + draw_rect(Rect2(LEFT_X + 3, y - CHANNEL_H / 2.0 + 3.0, HOME_X - LEFT_X - 6, 3.0), Color(0, 0, 0, 0.18)) + # luce interna in basso + draw_rect(Rect2(LEFT_X + 3, y + CHANNEL_H / 2.0 - 6.0, HOME_X - LEFT_X - 6, 3.0), Color(1, 1, 1, 0.25)) + # alloggiamenti circolari alle estremità (incassati) + for cx in [LEFT_X, HOME_X]: + var c := Vector2(cx, y) + draw_circle(c, SOCKET_R, FILL) + draw_arc(c, SOCKET_R, 0.0, TAU, 48, OUTLINE, 3.0) + # cavità: ombra in basso, luce in alto + draw_circle(c + Vector2(0, 5), SOCKET_R - 7.0, Color(0, 0, 0, 0.12)) + draw_circle(c + Vector2(0, -5), SOCKET_R - 7.0, Color(1, 1, 1, 0.18)) diff --git a/scripts/main.gd b/scripts/main.gd index 51e1e87..46aa87c 100644 --- a/scripts/main.gd +++ b/scripts/main.gd @@ -22,11 +22,11 @@ const HIT_RADIUS := BALL_RADIUS * 1.4 # area di tocco/clic (maggiorata) # singleton Settings e modificabili dal menù di configurazione in-game. const COLORS := { - "rosso": Color("e74c3c"), - "blu": Color("3498db"), - "verde": Color("2ecc71"), - "giallo": Color("f1c40f"), - "viola": Color("9b59b6"), + "rosso": Color("de6b7e"), # corallo + "blu": Color("1852de"), # cobalto + "verde": Color("88ce96"), # menta + "giallo": Color("e8b84b"), # ambra + "viola": Color("9b7ede"), # lavanda } # Note pentatoniche (Do4 Re4 Mi4 Sol4 La4): qualsiasi pallina toccata @@ -67,7 +67,7 @@ var options_menu: CanvasLayer func _ready() -> void: - _build_lanes() + add_child(load("res://scripts/board.gd").new()) _build_balls() _build_ui() _init_audio() @@ -121,23 +121,6 @@ func _toggle_options() -> void: # ---------------------------------------------------------------- costruzione -func _build_lanes() -> void: - for i in 5: - var y := LANE_TOP + i * LANE_GAP - var line := Line2D.new() - line.add_point(Vector2(90, y)) - line.add_point(Vector2(VIEW.x - 90, y)) - line.width = 2 - line.default_color = Color(1, 1, 1, 0.12) - add_child(line) - var lbl := Label.new() - lbl.text = COLORS.keys()[i].to_upper() - lbl.position = Vector2(100, y - 44) - lbl.add_theme_font_size_override("font_size", 16) - lbl.add_theme_color_override("font_color", Color(1, 1, 1, 0.35)) - add_child(lbl) - - func _build_balls() -> void: var names := COLORS.keys() for i in names.size(): @@ -156,13 +139,13 @@ func _build_ui() -> void: add_child(layer) var bar := ColorRect.new() - bar.color = Color(0.08, 0.09, 0.12, 0.95) + bar.color = Color(0.97, 0.97, 0.97, 0.95) bar.position = Vector2.ZERO bar.size = Vector2(VIEW.x, 140) layer.add_child(bar) var edge := ColorRect.new() - edge.color = Color(1, 1, 1, 0.15) + edge.color = Color(0, 0, 0, 0.15) edge.position = Vector2(0, 140) edge.size = Vector2(VIEW.x, 3) layer.add_child(edge) @@ -171,29 +154,32 @@ func _build_ui() -> void: tlabel.text = "BERSAGLIO" tlabel.position = Vector2(46, 26) tlabel.add_theme_font_size_override("font_size", 22) - tlabel.add_theme_color_override("font_color", Color(1, 1, 1, 0.8)) + tlabel.add_theme_color_override("font_color", Color(0.1, 0.1, 0.1, 0.85)) layer.add_child(tlabel) target_dot = load("res://scripts/target_dot.gd").new() - target_dot.position = Vector2(128, 84) + target_dot.position = Vector2(128, 96) layer.add_child(target_dot) help_label = Label.new() help_label.text = "Tocca la pallina corrispondente al bersaglio per lanciarla!" - help_label.position = Vector2(210, 96) + help_label.position = Vector2(VIEW.x / 2 - 300, 100) + help_label.size = Vector2(600, 30) + help_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER help_label.add_theme_font_size_override("font_size", 18) - help_label.add_theme_color_override("font_color", Color(1, 1, 1, 0.6)) + help_label.add_theme_color_override("font_color", Color(0.1, 0.1, 0.1, 0.55)) layer.add_child(help_label) score_label = Label.new() score_label.position = Vector2(VIEW.x - 320, 22) score_label.add_theme_font_size_override("font_size", 34) + score_label.add_theme_color_override("font_color", Color(0.1, 0.1, 0.1, 0.9)) layer.add_child(score_label) combo_label = Label.new() combo_label.position = Vector2(VIEW.x - 320, 68) combo_label.add_theme_font_size_override("font_size", 20) - combo_label.add_theme_color_override("font_color", Color(1, 1, 1, 0.65)) + combo_label.add_theme_color_override("font_color", Color(0.1, 0.1, 0.1, 0.6)) layer.add_child(combo_label) # pulsante Opzioni @@ -210,7 +196,7 @@ func _build_ui() -> void: milestone_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER milestone_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER milestone_label.add_theme_font_size_override("font_size", 56) - milestone_label.add_theme_color_override("font_color", Color(1.0, 0.9, 0.4)) + milestone_label.add_theme_color_override("font_color", Color(0.8, 0.55, 0.1)) milestone_label.visible = false layer.add_child(milestone_label) diff --git a/scripts/target_dot.gd b/scripts/target_dot.gd index f421938..004c2d5 100644 --- a/scripts/target_dot.gd +++ b/scripts/target_dot.gd @@ -6,9 +6,12 @@ var dot_color := Color.WHITE func _draw() -> void: - draw_circle(Vector2(0, 4), 36.0, Color(0, 0, 0, 0.3)) + draw_circle(Vector2(0, 4), 36.0, Color(0, 0, 0, 0.25)) draw_circle(Vector2.ZERO, 36.0, dot_color) - draw_arc(Vector2.ZERO, 36.0, 0.0, TAU, 40, Color(0, 0, 0, 0.4), 3.0) + draw_circle(Vector2(6.5, 8.0), 33.0, Color(0, 0, 0, 0.16)) + draw_circle(Vector2(-6.5, -8.0), 33.0, Color(1, 1, 1, 0.2)) + draw_arc(Vector2.ZERO, 36.0, 0.0, TAU, 40, Color(0.1, 0.1, 0.1, 0.9), 4.0) + draw_circle(Vector2(-11.0, -12.0), 6.0, Color(1, 1, 1, 0.85)) func set_color(c: Color) -> void: