extends Area2D ## Una singola pallina nella sua corsia. Partendo da destra, se lanciata ## scivola verso il bordo sinistro e poi torna alla posizione di partenza. ## Il rilevamento del tocco/click è gestito centralmente da main.gd tramite ## distanza: qui NON ci sono handler di input dedicati. signal returned # emesso quando la pallina torna a casa var color_name := "" var ball_color := Color.WHITE var radius := 40.0 var home_pos := Vector2.ZERO var left_pos := Vector2.ZERO var in_motion := false var _tween: Tween func _draw() -> void: # ombra draw_circle(Vector2(0, 5), radius, Color(0, 0, 0, 0.3)) # corpo 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)) func setup(cn: String, c: Color, home: Vector2, left: Vector2, r: float) -> void: color_name = cn ball_color = c radius = r home_pos = home left_pos = left position = home var shape := CollisionShape2D.new() var cs := CircleShape2D.new() cs.radius = r * 1.35 # area di tocco ampliata (ma l'input è via distanza in main) shape.shape = cs add_child(shape) queue_redraw() func is_home() -> bool: return not in_motion func reset() -> void: if _tween and _tween.is_valid(): _tween.kill() in_motion = false position = home_pos ## Lancia la pallina verso sinistra e la fa tornare a casa. `mt` è il tempo ## totale (andata + ritorno) in secondi. func launch(mt: float) -> void: in_motion = true if _tween and _tween.is_valid(): _tween.kill() var half := maxf(mt * 0.5, 0.01) _tween = create_tween() _tween.tween_property(self, "position", left_pos, half) \ .set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT) _tween.tween_property(self, "position", home_pos, half) \ .set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT) _tween.finished.connect(_on_motion_done) func _on_motion_done() -> void: in_motion = false returned.emit()