diff --git a/menu_principal/menu_principal_affichage.tscn b/menu_principal/menu_principal_affichage.tscn index 04c0b12..5f96e20 100644 --- a/menu_principal/menu_principal_affichage.tscn +++ b/menu_principal/menu_principal_affichage.tscn @@ -202,7 +202,6 @@ layout_mode = 1 [node name="MusiqueFond" type="AudioStreamPlayer" parent="."] stream = ExtResource("8_sq6yk") autoplay = true -bus = &"Music" [connection signal="pressed" from="Menu_principal/HBoxContainer/VBoxMainButton/play_button" to="." method="_on_play_button_pressed"] [connection signal="pressed" from="Menu_principal/HBoxContainer/VBoxMainButton/load_button" to="." method="_on_load_button_pressed"] diff --git a/project.godot b/project.godot index 09e5c56..5aeb0e2 100644 --- a/project.godot +++ b/project.godot @@ -72,6 +72,11 @@ JOUER_MUSIQUE_GAUCHE={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +CHANGER_SLOT={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [rendering] diff --git a/ressources/images/blob-1.png.png.import b/ressources/images/blob-1.png.png.import new file mode 100644 index 0000000..f1475ed --- /dev/null +++ b/ressources/images/blob-1.png.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dchan5vdmu4n0" +path="res://.godot/imported/blob-1.png.png-d6117acd2391c64f472af8433c684912.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ressources/images/blob-1.png.png" +dest_files=["res://.godot/imported/blob-1.png.png-d6117acd2391c64f472af8433c684912.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ressources/images/blob-2-4.png.png.import b/ressources/images/blob-2-4.png.png.import new file mode 100644 index 0000000..47ff61c --- /dev/null +++ b/ressources/images/blob-2-4.png.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bllbd2jxgi270" +path="res://.godot/imported/blob-2-4.png.png-808d98b15f20529346c9c4c50162a975.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ressources/images/blob-2-4.png.png" +dest_files=["res://.godot/imported/blob-2-4.png.png-808d98b15f20529346c9c4c50162a975.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ressources/images/blob-3.png.png.import b/ressources/images/blob-3.png.png.import new file mode 100644 index 0000000..a85f072 --- /dev/null +++ b/ressources/images/blob-3.png.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://32dcs4rylimt" +path="res://.godot/imported/blob-3.png.png-902563b57bcfa6ab9c15d19bab7245bc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ressources/images/blob-3.png.png" +dest_files=["res://.godot/imported/blob-3.png.png-902563b57bcfa6ab9c15d19bab7245bc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ressources/images/ronde tambour.png.png.import b/ressources/images/ronde tambour.png.png.import new file mode 100644 index 0000000..59e2a39 --- /dev/null +++ b/ressources/images/ronde tambour.png.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq2gg8sxvwth2" +path="res://.godot/imported/ronde tambour.png.png-8204fac6218763c8b21d53d07c48f5f9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ressources/images/ronde tambour.png.png" +dest_files=["res://.godot/imported/ronde tambour.png.png-8204fac6218763c8b21d53d07c48f5f9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ressources/images/ronde-tambour.png.import b/ressources/images/ronde-tambour.png.import new file mode 100644 index 0000000..d36c3cc --- /dev/null +++ b/ressources/images/ronde-tambour.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h0y356ur32vi" +path="res://.godot/imported/ronde-tambour.png-ee4e4d2b4e71a4aef719ad8901b83c4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ressources/images/ronde-tambour.png" +dest_files=["res://.godot/imported/ronde-tambour.png-ee4e4d2b4e71a4aef719ad8901b83c4c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/attaques/Balle.tscn b/scenes/attaques/Balle1.tscn similarity index 78% rename from scenes/attaques/Balle.tscn rename to scenes/attaques/Balle1.tscn index c50992c..473cd8f 100644 --- a/scenes/attaques/Balle.tscn +++ b/scenes/attaques/Balle1.tscn @@ -1,15 +1,15 @@ [gd_scene load_steps=3 format=3 uid="uid://btpp8l4efhrmj"] -[ext_resource type="Script" path="res://scripts/Instrument/balle.gd" id="1_4kd3w"] -[ext_resource type="Texture2D" uid="uid://csbrejwjfkspr" path="res://ressources/images/note1.png" id="1_qx664"] +[ext_resource type="Script" path="res://scripts/Instrument/balle.gd" id="1_mw8yb"] +[ext_resource type="Texture2D" uid="uid://csbrejwjfkspr" path="res://ressources/images/note1.png" id="2_xpv2h"] [node name="Balle1" type="CharacterBody2D" node_paths=PackedStringArray("raycast")] -script = ExtResource("1_4kd3w") +script = ExtResource("1_mw8yb") raycast = NodePath("RayCast2D") [node name="Sprite2D" type="Sprite2D" parent="."] rotation = 3.14159 -texture = ExtResource("1_qx664") +texture = ExtResource("2_xpv2h") [node name="RayCast2D" type="RayCast2D" parent="."] position = Vector2(0, -7) diff --git a/scenes/attaques/Balle2.tscn b/scenes/attaques/Balle2.tscn new file mode 100644 index 0000000..959f982 --- /dev/null +++ b/scenes/attaques/Balle2.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://crpjmum8m2m1b"] + +[ext_resource type="Script" path="res://scripts/Instrument/balle.gd" id="1_gf62f"] +[ext_resource type="Texture2D" uid="uid://1xayae6jyuge" path="res://ressources/images/note2.png" id="2_5005k"] + +[node name="Balle1" type="CharacterBody2D" node_paths=PackedStringArray("raycast")] +script = ExtResource("1_gf62f") +raycast = NodePath("RayCast2D") + +[node name="Sprite2D" type="Sprite2D" parent="."] +rotation = 3.14159 +texture = ExtResource("2_5005k") + +[node name="RayCast2D" type="RayCast2D" parent="."] +position = Vector2(0, -7) +target_position = Vector2(0, 15) diff --git a/scenes/attaques/Balle3.tscn b/scenes/attaques/Balle3.tscn new file mode 100644 index 0000000..c825cf4 --- /dev/null +++ b/scenes/attaques/Balle3.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://j4j8mg7jhuwy"] + +[ext_resource type="Script" path="res://scripts/Instrument/balle.gd" id="1_7dxcl"] +[ext_resource type="Texture2D" uid="uid://cq5j2fb07d7f8" path="res://ressources/images/notes3.svg" id="2_gx4yt"] + +[node name="Balle1" type="CharacterBody2D" node_paths=PackedStringArray("raycast")] +script = ExtResource("1_7dxcl") +raycast = NodePath("RayCast2D") + +[node name="Sprite2D" type="Sprite2D" parent="."] +rotation = 3.14159 +texture = ExtResource("2_gx4yt") + +[node name="RayCast2D" type="RayCast2D" parent="."] +position = Vector2(0, -7) +target_position = Vector2(0, 15) diff --git a/scenes/attaques/Onde.tscn b/scenes/attaques/Onde.tscn new file mode 100644 index 0000000..fe2c8be --- /dev/null +++ b/scenes/attaques/Onde.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://y2j5qtyg4vt3"] + +[ext_resource type="Script" path="res://scripts/Instrument/onde.gd" id="1_6377h"] +[ext_resource type="Texture2D" uid="uid://bq2gg8sxvwth2" path="res://ressources/images/ronde tambour.png.png" id="1_oawub"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_r81ru"] +radius = 125.575 + +[node name="Onde" type="CharacterBody2D"] +collision_layer = 2 +collision_mask = 2 +script = ExtResource("1_6377h") + +[node name="Sprite2D" type="Sprite2D" parent="."] +scale = Vector2(2.5, 2.5) +texture = ExtResource("1_oawub") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_r81ru") diff --git a/scripts/Instrument/Flute.gd b/scripts/Instrument/Flute.gd index fcd6de6..f7d41c1 100644 --- a/scripts/Instrument/Flute.gd +++ b/scripts/Instrument/Flute.gd @@ -1,28 +1,66 @@ class_name Flute var scene_node = null +var balle_scenes = [ + preload("res://scenes/attaques/Balle1.tscn"), + preload("res://scenes/attaques/Balle2.tscn"), + preload("res://scenes/attaques/Balle3.tscn") +] +var current_balle_index = 0 + +@export var cooldown = 0.15 # Durée du cooldown en secondes +var is_on_cooldown = false # Indique si le cooldown est en cours func set_scene_parent(node: Node) -> void: scene_node = node + # Si scene_node est défini pour la première fois, on ajoute un Timer + if not scene_node.has_node("TirCooldownTimer"): + var cooldown_timer = Timer.new() + cooldown_timer.name = "TirCooldownTimer" + cooldown_timer.one_shot = true + cooldown_timer.wait_time = cooldown + cooldown_timer.connect("timeout", Callable(self, "_on_cooldown_timeout")) + scene_node.add_child(cooldown_timer) - -func jouer_melodie(player_position, direction_balle, angle) -> void: - spawn_balle(player_position, direction_balle, angle) +func _process(delta) -> void: + pass # Cette fonction est requise pour que delta fonctionne correctement -func spawn_balle(player_position, direction_balle, angle) -> void: +func jouer_melodie(player_position: Vector2, direction_balle: Vector2, angle: float) -> void: + if not is_on_cooldown: # Vérifiez si nous pouvons tirer + spawn_balle(player_position, direction_balle, angle) + + +func spawn_balle(player_position: Vector2, direction_balle: Vector2, angle: float) -> void: if scene_node == null: print("Erreur : Aucun nœud parent défini pour ajouter la balle.") return - - var balle = preload("res://scenes/attaques/Balle.tscn").instantiate() + + var current_balle_scene = balle_scenes[current_balle_index] + var balle = current_balle_scene.instantiate() + if balle: - balle.position = player_position + balle.position = player_position balle.initial_direction = direction_balle balle.rotation = deg_to_rad(angle) scene_node.add_child(balle) - + # Basculer vers la prochaine balle pour le prochain tir + current_balle_index = (current_balle_index + 1) % len(balle_scenes) + + # Démarrez le cooldown après ce tir + start_cooldown() else: print("Erreur : la création de la balle a échoué.") + + +# Démarrer le timer pour le cooldown +func start_cooldown() -> void: + is_on_cooldown = true + var cooldown_timer = scene_node.get_node("TirCooldownTimer") + cooldown_timer.start() + + +func _on_cooldown_timeout() -> void: + is_on_cooldown = false # Réinitialisez l'état de cooldown après expiration du Timer diff --git a/scripts/Instrument/Tambour.gd b/scripts/Instrument/Tambour.gd index 6b5c712..4f2961e 100644 --- a/scripts/Instrument/Tambour.gd +++ b/scripts/Instrument/Tambour.gd @@ -1,5 +1,55 @@ class_name Tambour +var scene_node = null +@export var cooldown = 0.9 # Durée du cooldown en secondes +var is_on_cooldown = false # Indique si le cooldown est actif -func faire_roulement() -> void: - print("Le tambour fait un roulement.") +func set_scene_parent(node: Node) -> void: + scene_node = node + # Si scene_node est défini pour la première fois, on ajoute un Timer + if not scene_node.has_node("TambourCooldownTimer2"): # Changement du nom du Timer unique pour le Tambour + var cooldown_timer = Timer.new() + cooldown_timer.name = "TambourCooldownTimer2" # Nom unique pour éviter les conflits + cooldown_timer.one_shot = true + cooldown_timer.wait_time = cooldown + cooldown_timer.connect("timeout", Callable(self, "_on_cooldown_timeout")) + scene_node.add_child(cooldown_timer) + + +func jouer_melodie(player_position: Vector2) -> void: + if not is_on_cooldown: # Vérifiez si nous sommes en cooldown + spawn_onde(player_position) + + + +func spawn_onde(player_position: Vector2) -> void: + if scene_node == null: + print("Erreur : Aucun nœud parent défini pour ajouter l'onde.") + return + + var onde_scene = preload("res://scenes/attaques/Onde.tscn") # Chargez la scène de l'onde + var onde = onde_scene.instantiate() + + if onde: + onde.position = player_position + scene_node.add_child(onde) + + # Démarrez le cooldown après avoir ajouté l'onde + start_cooldown() + else: + print("Erreur : Impossible de créer l'onde.") + + +# Démarrer le Timer pour le cooldown +func start_cooldown() -> void: + is_on_cooldown = true + var cooldown_timer = scene_node.get_node("TambourCooldownTimer2") # Assurez-vous que le Timer est bien trouvé + if cooldown_timer: + cooldown_timer.start() + else: + print("Erreur : Timer introuvable.") + + +func _on_cooldown_timeout() -> void: + is_on_cooldown = false # Réinitialiser le cooldown lorsque le Timer se termine + print("Cooldown terminé.") diff --git a/scripts/Instrument/onde.gd b/scripts/Instrument/onde.gd new file mode 100644 index 0000000..01ba3de --- /dev/null +++ b/scripts/Instrument/onde.gd @@ -0,0 +1,20 @@ +extends CharacterBody2D + +var cooldown_timer = null + +func _process(delta: float) -> void: + if cooldown_timer == null: + cooldown_timer = Timer.new() + cooldown_timer.name = "OndeCooldownTimer" + cooldown_timer.one_shot = true + cooldown_timer.connect("timeout", Callable(self, "_on_cooldown_timeout")) + get_tree().root.add_child(cooldown_timer) + +# Démarrer le timer pour le cooldown +func start_cooldown() -> void: + cooldown_timer.start() + +func _on_cooldown_timeout() -> void: + cooldown_timer.queue_free() + cooldown_timer = null + queue_free() diff --git a/scripts/player_control.gd b/scripts/player_control.gd index 98d444b..f097c21 100644 --- a/scripts/player_control.gd +++ b/scripts/player_control.gd @@ -6,11 +6,20 @@ const max_boost_speed = 800 var previous_direction = Vector2.ZERO var boost_speed = 0 + var flute = null +var tambour = null + +# Slot actif (0 = Flûte, 1 = Tambour) +var active_slot = 0 + func _ready() -> void: flute = load("res://scripts/Instrument/Flute.gd").new() flute.set_scene_parent(get_tree().get_root()) + + tambour = load("res://scripts/Instrument/Tambour.gd").new() + tambour.set_scene_parent(get_tree().get_root()) @@ -35,21 +44,28 @@ func _process(delta: float) -> void: previous_direction = direction velocity = direction * (move_speed + boost_speed) - if Input.is_action_just_pressed("JOUER_MUSIQUE_HAUT") or Input.is_action_just_pressed("JOUER_MUSIQUE_BAS") or Input.is_action_just_pressed("JOUER_MUSIQUE_DROITE") or Input.is_action_just_pressed("JOUER_MUSIQUE_GAUCHE"): + if Input.is_action_just_pressed("CHANGER_SLOT"): + active_slot = (active_slot + 1) % 2 + + if Input.is_action_pressed("JOUER_MUSIQUE_HAUT") or Input.is_action_pressed("JOUER_MUSIQUE_BAS") or Input.is_action_pressed("JOUER_MUSIQUE_DROITE") or Input.is_action_pressed("JOUER_MUSIQUE_GAUCHE"): var direction_balle = Vector2.ZERO var angle = 0 - if Input.is_action_just_pressed("JOUER_MUSIQUE_HAUT"): + if Input.is_action_pressed("JOUER_MUSIQUE_HAUT"): direction_balle = Vector2(0, -1) angle = 180 - elif Input.is_action_just_pressed("JOUER_MUSIQUE_BAS"): + elif Input.is_action_pressed("JOUER_MUSIQUE_BAS"): direction_balle = Vector2(0, 1) angle = 0 - elif Input.is_action_just_pressed("JOUER_MUSIQUE_DROITE"): + elif Input.is_action_pressed("JOUER_MUSIQUE_DROITE"): direction_balle = Vector2(1, 0) angle = 270 - elif Input.is_action_just_pressed("JOUER_MUSIQUE_GAUCHE"): + elif Input.is_action_pressed("JOUER_MUSIQUE_GAUCHE"): direction_balle = Vector2(-1, 0) angle = 90 - flute.jouer_melodie(position, direction_balle, angle) + if active_slot == 0: # Slot Flûte + flute.jouer_melodie(position, direction_balle, angle) + elif active_slot == 1: # Slot Tambour + tambour.jouer_melodie(position) + pass