View on GitHub

Zelda-Like Creation Guide

Un guide complet pour créer un jeu de type Zelda avec Godot Engine.

🗝️ Créer un coffre avec un objet visible à l’ouverture (version débutant)

Dans ce guide, on va apprendre à créer un coffre simple qui s’ouvre quand le joueur s’approche.
Une animation se joue automatiquement, et un objet (ex : une pomme 🍏) apparaît !

Ce sera notre version de base, idéale pour commencer à poser les fondations des coffres dans un RPG 🧰


🎯 Objectif


🧱 Étapes de création

1️⃣ Crée une nouvelle scène Coffre.tscn

Node principal : Area2D → nomme-le Coffre

Ajoute dedans :


2️⃣ Prépare les animations du coffre

Dans AnimatedSprite2D :

💡 Commence avec "close" comme animation par défaut


3️⃣ Crée l’objet à faire apparaître

Tu peux utiliser une pomme qu’on a déjà faite dans Pomme.tscn, ou une simple Sprite2D avec une image.


4️⃣ Script sur le coffre

Crée un nouveau script Coffre.gd et écris :

extends Area2D

@onready var animated_sprite = $AnimatedSprite2D
@onready var spawn_point = $SpawnPoint
var coffre_ouvert = false
var scene_objet = preload("res://Pomme.tscn") # remplace avec ton vrai chemin

func _on_body_entered(body):
	if body.name == "Player" and not coffre_ouvert:
		coffre_ouvert = true
		animated_sprite.play("open")
		var objet = scene_objet.instantiate()
		spawn_point.add_child(objet)

5️⃣ Connecte le signal body_entered

Comme pour la pomme :


✅ Mise à jour v1.2 - Amélioration du coffre

On améliore notre coffre pour qu’il ne s’ouvre qu’une seule fois, et n’engendre qu’un seul objet.
Car oui, un coffre magique qui génère une infinité de pommes… ce n’est pas très réaliste 😅


💡 Pourquoi c’était un problème avant ?

Sans vérification, chaque entrée du joueur déclenchait à nouveau :


✅ Solution logique

On utilise une variable de contrôle : coffre_ouvert

Et on vérifie sa valeur avant d’ouvrir :

if body.name == "Player" and coffre_ouvert == false:
	coffre_ouvert = true
	animated_sprite_2d.play("open")
	var objet = scene_objet.instantiate()
	spawn_point.call_deferred("add_child", objet)
	await get_tree().create_timer(0.5).timeout
	animated_sprite_2d.play("close")

❓ Pourquoi call_deferred() ?

⚠️ Si on utilise add_child() directement pendant une détection de collision (body_entered), Godot peut générer une erreur :

"Can't change this state while flushing queries"

C’est pour ça qu’on utilise :

spawn_point.call_deferred("add_child", objet)

✅ Cela repousse l’action à un moment sûr, juste après la fin du signal.
On avait déjà vu ça dans le guide de la pomme 🍏, quand on faisait queue_free() sur la collision.


✅ Résultat attendu


🧪 Exercices


👩‍💻 Écrit par : Lysdora