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 = trueBoom 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.
Défi
Moyen- Dans
rock.gd, ajoutesignal hit_shipet émets-le lorsque le corps est leShip. - Dans
main.gd, connecte-le dansspawn_rockà_on_hit_ship. Cela afficheGame Over, masque le vaisseau, fait exploser$Boomà l’endroit où se trouvait le vaisseau et met le jeu en pause. - 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
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 : jeu de tir d’astéroïdes
Faire tourner le vaisseauMettre le moteur en marcheEntraînez-vous par vous-même : Playground Godot