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 = trueBoom 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.
Défi
MoyenTermine la partie lorsqu’un rocher percute le vaisseau.
- Dans
rock.gd, ajoutesignal hit_shipet émets-le lorsque le corps est leShip. - Dans
main.gd, connecte-le dansspawn_rockà_on_hit_ship, qui afficheGame Over, masque le vaisseau, fait éclater$Boomà l’endroit où il se trouvait et met le jeu en pause. - 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
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
2Projet : Tir aux astéroïdes
Tourner le vaisseauAllumer le moteurEntraînez-vous par vous-même : Playground Godot