extends CanvasLayer @onready var game_area: ColorRect = $BackGround/GameArea @onready var target_rect: ColorRect = $BackGround/GameArea/TargetRect @onready var feather: ColorRect = $BackGround/GameArea/Feather @onready var player: CharacterBody3D = $".." @onready var frog: CharacterBody3D = $"../../frog" var cpt_col : int = -1 var is_playing : bool = false var is_flashing : bool = false var default_target_color : Color = Color(1.0, 1.0, 1.0, 0.6) var tween : Tween func _ready(): hide() target_rect.color = default_target_color func _input(event): if Input.is_action_just_pressed("ui_accept") and player.can_play: toggle_minigame() # Contrôle de la plume avec la souris (uniquement sur Y) if is_playing and event is InputEventMouseMotion: var local_mouse_y = game_area.get_local_mouse_position().y feather.position.y = clamp(local_mouse_y, 0, game_area.size.y - feather.size.y) func toggle_minigame(): is_playing = !is_playing if is_playing: show() Input.mouse_mode = Input.MOUSE_MODE_VISIBLE player.camera_pov.make_current() target_rect.position.y = game_area.size.y - target_rect.size.y await get_tree().create_timer( 2 ).timeout if is_playing: player.can_play = false start_pattern() else: player.can_play = true player.camera.make_current() hide() Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if tween: tween.kill() if cpt_col == -1: return cpt_col/= 2 if cpt_col < 2: frog.size = 1 elif cpt_col == 2 or cpt_col == 3: if frog.size > 1.5: frog.size = 1.5 else: if frog.size > 2: frog.size = 2 func start_pattern(): if tween: tween.kill() if is_playing: tween = create_tween() else: return var bottom_y = game_area.size.y - target_rect.size.y var top_y = 0.0 tween.tween_property(target_rect, "position:y", top_y, 5) tween.tween_interval(4.0) tween.tween_property(target_rect, "position:y", bottom_y, 5) tween.tween_interval(4.0) await tween.finished if cpt_col == -1: cpt_col = 0 toggle_minigame() func _process(delta): if not is_playing: return # On vérifie si le centre de la plume est dans le rectangle var feather_center = feather.position.y + (feather.size.y / 2.0) var rect_top = target_rect.position.y var rect_bottom = target_rect.position.y + target_rect.size.y var is_inside = feather_center >= rect_top and feather_center <= rect_bottom # Si elle est dehors et qu'on n'est pas déjà en train de clignoter en rouge if not is_inside and not is_flashing and !player.can_play : # can_play juste pour le début trigger_error() func trigger_error(): is_flashing = true cpt_col += 1 # Passage en rouge target_rect.color = Color.RED # On attend 0.5 secondes await get_tree().create_timer(0.5).timeout # Retour à la normale target_rect.color = default_target_color is_flashing = false