Menu
CoddyTech

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.

challenge icon

Défi

Difficile

Fais en sorte que les rochers touchés se divisent en deux.

  1. Dans rock.gd, ajoute signal broken(rock) et appelle broken.emit(self) lorsqu’une balle touche un rocher, avant queue_free().
  2. Dans main.gd, connecte le signal broken de chaque rocher à _on_rock_broken dans spawn_rock.
  3. Dans _on_rock_broken(rock), fais apparaître deux rochers comme indiqué, avec call_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