Board hand-drawn style: cream board, recessed gray lanes with sockets, glossy balls

This commit is contained in:
enne2
2026-08-18 14:59:56 +02:00
parent 54619a2385
commit 4d7aa698e3
4 changed files with 76 additions and 40 deletions
+11 -7
View File
@@ -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:
+43
View File
@@ -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))
+17 -31
View File
@@ -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)
+5 -2
View File
@@ -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: