Menu
CoddyTech

Collision et recommencer

Fait partie de la section Projets du Journey Godot de Coddy. Leçon 21 sur 36.

Le vaisseau traverse des rochers. Un rocher qui touche le vaisseau doit mettre fin à la partie. Dans rock.gd, dans _on_body_entered, le vaisseau est le corps nommé Ship. Le rocher émet un signal hit_ship. main.gd le connecte dans spawn_rock et met fin à la partie :

func _on_hit_ship():
	$HUD/Message.text = "Game Over"
	$Ship.hide()
	$Boom.position = $Ship.position
	$Boom.emitting = true
	get_tree().paused = true

Boom est un CPUParticles2D à émission unique. Réglez emitting sur true pour qu’il produise une seule explosion. C’est un enfant de Main, dont le mode est Always : il continue donc à jouer lorsque le jeu est en pause.

Enfin, faites en sorte que la touche Entrée démarre une nouvelle partie lorsque le jeu est en pause, comme dans Breakout : désactivez la pause, puis appelez reload_current_scene(). Cela fonctionne aussi après une victoire.

challenge icon

Défi

Moyen

Termine la partie lorsqu’un rocher percute le vaisseau.

  1. Dans rock.gd, ajoute signal hit_ship et émets-le lorsque le corps est le Ship.
  2. Dans main.gd, connecte-le dans spawn_rock à _on_hit_ship, qui affiche Game Over, masque le vaisseau, fait éclater $Boom à l’endroit où il se trouvait et met le jeu en pause.
  3. Pendant la pause, appuie sur Entrée pour reprendre et recharger la scène.

Clique sur « Jouer » et fonce sur un rocher : le vaisseau explose. Puis clique sur « Vérifier ».

Essayez vous-même

extends Node2D

const ROCK = preload("res://rock.tscn")

var score = 0
var rocks_left = 4

func _ready():
	for i in 4:
		spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)), 2)
	$HUD/Score.text = "Score: 0"

func spawn_rock(where, velocity, size):
	var rock = ROCK.instantiate()
	rock.position = where
	rock.velocity = velocity
	rock.size = size
	rock.broken.connect(_on_rock_broken)
	add_child(rock)

func _on_rock_broken(rock):
	if rock.size == 2:
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5, 1)
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5, 1)
		score += 20
		rocks_left += 2
	else:
		score += 50
	rocks_left -= 1
	$HUD/Score.text = "Score: %d" % score
	if rocks_left == 0:
		$HUD/Message.text = "You win!"
		get_tree().paused = true
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Godot