extends CanvasLayer class_name AimReticle #reticule 2D au centre de l'ecran (visee libre / charge du lancer) #cree a la volee, une seule instance partagee par AimState et ThrowState static var _instance : AimReticle static func get_instance(from : Node) -> AimReticle: if is_instance_valid(_instance): return _instance _instance = AimReticle.new() from.get_tree().current_scene.add_child(_instance) return _instance static func show_instance(from : Node) -> void: get_instance(from).visible = true static func hide_instance() -> void: if is_instance_valid(_instance): _instance.visible = false func _init() -> void: layer = 10 visible = false add_child(Drawer.new()) class Drawer extends Control: @export var radius : float = 14.0 @export var tick_length : float = 8.0 @export var color : Color = Color(1.0, 1.0, 1.0, 0.9) @export var outline_color : Color = Color(0.0, 0.0, 0.0, 0.5) #contour sombre pour rester lisible sur fond clair func _init() -> void: set_anchors_preset(Control.PRESET_FULL_RECT) mouse_filter = Control.MOUSE_FILTER_IGNORE func _ready() -> void: resized.connect(queue_redraw) func _draw() -> void: var c : Vector2 = size / 2.0 #contour sombre, puis trait clair par-dessus draw_arc(c, radius, 0.0, TAU, 40, outline_color, 4.0, true) draw_circle(c, 3.0, outline_color) for dir : Vector2 in [Vector2.UP, Vector2.DOWN, Vector2.LEFT, Vector2.RIGHT]: draw_line(c + dir * (radius + 2.0), c + dir * (radius + 2.0 + tick_length), outline_color, 4.0) draw_arc(c, radius, 0.0, TAU, 40, color, 2.0, true) draw_circle(c, 1.5, color) for dir : Vector2 in [Vector2.UP, Vector2.DOWN, Vector2.LEFT, Vector2.RIGHT]: draw_line(c + dir * (radius + 2.0), c + dir * (radius + 2.0 + tick_length), color, 2.0)