118 lines
2.8 KiB
GDScript
118 lines
2.8 KiB
GDScript
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
|