Menu
CoddyTech

Collision et redémarrage

Fait partie de la section Projets du Journey Godot de Coddy. Leçon 18 sur 33.

Le vaisseau se faufile entre les rochers. Un rocher qui touche le vaisseau devrait mettre fin à la partie. Dans rock.gd, dans _on_body_entered, le corps nommé Ship correspond au vaisseau. 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 et il produit une seule rafale. C'est un enfant de Main, dont le mode est Always : il s'anime donc pendant que le jeu est en pause.

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

challenge icon

Défi

Moyen
  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. Cela affiche Game Over, masque le vaisseau, fait exploser $Boom à l’endroit où se trouvait le vaisseau et met le jeu en pause.
  3. Lorsque le jeu est en pause, la touche Entrée le réactive et recharge la scène.

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