Scinder les rochers
Fait partie de la section Projets du Journey Godot de Coddy. Leçon 18 sur 36.
Un rocher touché doit se scinder en deux. Le rocher signale qu’il s’est brisé avec signal broken(rock) et broken.emit(self). self désigne le rocher ; l’écouteur sait donc où il se trouvait et comment il se déplaçait.
spawn_rock connecte chaque nouveau rocher avec rock.broken.connect(_on_rock_broken), et cette fonction fait apparaître deux rochers qui partent dans des directions opposées :
func _on_rock_broken(rock):
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)Le signal arrive pendant que Godot vérifie quelles zones se touchent. Ajouter une zone à ce moment-là arrête le jeu avec le message Can't change this state while flushing queries. call_deferred exécute l’appel à la fin de l’image, quand cela ne pose aucun problème.
Pour l’instant, chaque rocher se scinde, donc ils ne s’épuisent jamais. La taille sera abordée ensuite.
Défi
DifficileFais en sorte que les rochers touchés se divisent en deux.
- Dans
rock.gd, ajoutesignal broken(rock)et appellebroken.emit(self)lorsqu’une balle touche un rocher, avantqueue_free(). - Dans
main.gd, connecte le signalbrokende chaque rocher à_on_rock_brokendansspawn_rock. - Dans
_on_rock_broken(rock), fais apparaître deux rochers comme indiqué, aveccall_deferred.
Appuie sur « Jouer » et tire sur un rocher : deux rochers s’envolent en s’éloignant l’un de l’autre. Puis appuie sur « Vérifier ».
Essayez vous-même
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
Toutes les leçons de Projets
Entraînez-vous par vous-même : Playground Godot