đ CrĂ©er un systĂšme de Collectables dans Godot 4.4
Dans cette leçon, nous allons apprendre Ă crĂ©er un systĂšme de collectables (comme des potions, des piĂšces ou dâautres objets Ă ramasser) dans notre RPG Zelda-like. đźâš
Nous allons procéder par étapes pour bien comprendre chaque concept.
đ Objectif
CrĂ©er un Collectable qui disparaĂźt lorsquâil est ramassĂ© par le joueur, grĂące Ă un script simple.
đ PrĂ©paration
- Godot 4.4.1
- Dossier dédié :
collectables/
đ Ătape 1 : CrĂ©ation de la scĂšne Collectable
- Crée une nouvelle scÚne en tant que
Area2D
. - Renomme-la
Collectable
. - Ajoute un
Sprite2D
en tant que child deCollectable
. - Ajoute un
CollisionShape2D
en tant que child deCollectable
. - Sélectionne
CollisionShape2D
et clique surMake Unique
pour la rendre indépendante. - (Important !) Cela permet de modifier chaque
CollisionShape2D
séparément pour chaque objet que tu créeras à partir de ce template.
đŻ Ta hiĂ©rarchie devrait ressembler Ă ceci :
Collectable (Area2D)
âââ Sprite2D
âââ CollisionShape2D
âïž Ătape 2 : Ajouter le script de collectable
- Ajoute un nouveau script au noeud
Collectable
avec le code suivant :
extends Area2D
func collect():
queue_free()
đ Ici, la mĂ©thode collect()
va supprimer (queue_free()
) lâobjet dĂšs quâil est ramassĂ© par le joueur.
đ Ătape 3 : CrĂ©er un Template dâItem
- Sauvegarde ta scĂšne
Collectable
dans ton dossier dédié :collectables/
. - Clique sur
Scene > New Inherit Scene
pour créer un nouvel objet basé surCollectable
. - Ajoute un Sprite pour représenter ton item (ex: potion).
- Clique sur
CollisionShape2D
et clique surMake Unique
pour pouvoir modifier sa forme indépendamment des autres objets. - Ajuste la
CollisionShape2D
pour correspondre au sprite. - Sauvegarde cette scÚne spécifique (par exemple,
Potion.tscn
) dans ton dossiercollectables/
.
â
En rendant chaque CollisionShape2D
unique (Make Unique
), tu pourras facilement ajuster les collisions pour chaque type dâobjet.
đșïž Ătape 4 : DĂ©tection de la collecte par le joueur
- Ajoute un
Area2D
nomméHurtBox
au noeudPlayer
. - Ajoute un
CollisionShape2D
en tant que child deHurtBox
. - Crée un signal pour détecter les collisions :
func _on_hurt_box_area_shape_entered(area_rid: RID, area: Area2D, area_shape_index: int, local_shape_index: int) -> void:
if area.has_method("collect"):
area.collect()
đ Cela signifie que lorsque ton joueur dĂ©tecte une Area2D
qui possĂšde une fonction collect()
, elle sera supprimĂ©e ! đ
đ Ătape 5 : CrĂ©ation dâune ScĂšne Collection avec TileMap
- Crée un nouveau TileMap Layer sous ton noeud principal (par exemple,
Campagne
). - Renomme ce TileMap en
Collectables
. - Dans lâinspecteur, clique sur
Tile Set
et appuie sur le bouton+
à cÎté de la poubelle en bas à gauche. - Sélectionne
Scene Collection
et renomme-la enCollectable
. - Fais glisser tes scĂšnes de collectables (par exemple
life_pot.tscn
etsword.tscn
) dans la zone prĂ©vue pour les ajouter Ă ta collection. - Maintenant, tu peux facilement placer ces objets collectables directement sur ta carte en cliquant et en les positionnant ! đ
đĄïž Ătape 6 : CrĂ©ation de lâĂpĂ©e (Sword) avec Animation
đ Nous allons maintenant ajouter une Ă©pĂ©e qui sâanime quand Elara la ramasse !
đš CrĂ©ation de lâĂpĂ©e
- Crée une nouvelle scÚne héritée de
Collectable
(clic droit surCollectable > New Inherit Scene
). - Renomme-la
Sword
. - Ajoute un sprite dâĂ©pĂ©e (si tu utilises une spritesheet :
New Atlas Texture > Edit Region > Active Pixel Snap > Sélectionne l'épée
). - Ajoute un
AnimationPlayer
au noeudSword
.
đŸ CrĂ©ation de lâAnimation
- Renomme lâanimation en
"spin"
. - Sur la timeline, mets une durée de
0.4
secondes. - SĂ©lectionne lâĂ©pĂ©e et clique sur
Rotation
dans lâinspecteur (Transform > Rotation
). - Ă
0
seconde, ajoute une clĂ© (icĂŽne de clĂ©). - Ă
0.2
seconde, fais lĂ©gĂšrement pivoter lâĂ©pĂ©e et ajoute une nouvelle clĂ©. - Ă
0.4
seconde, remets lâĂ©pĂ©e dans sa position initiale et ajoute une clĂ©.
đ Script de lâĂpĂ©e
- CrĂ©e un nouveau script en lâattachant au
Sword
. - Déplace le script
collectable.gd
en tĂȘte dâextension avec :
extends "res://scenes/collectables/collectable.gd"
@onready var animation: AnimationPlayer = $AnimationPlayer
func collect():
animation.play("spin")
await animation.animation_finished
super.collect()
đĄ Explication :
- Le
await animation.animation_finished
signifie que le script attend que lâanimation soit terminĂ©e avant de continuer. super.collect()
permet dâappeler la fonctioncollect()
de la scĂšneCollectable
qui fait disparaĂźtre lâobjet (queue_free()
).
â Conclusion
âš Bravo ! Tu viens dâajouter un nouvel objet dynamique avec une animation au ramassage ! đ
On peut maintenant ajouter des Ă©pĂ©es, des potions, et bien plus Ă notre jeu. đ