Schianto e riavvio
Fa parte della sezione Progetti del percorso Godot di Coddy. Lezione 21 di 36.
La nave vola tra le rocce. Una roccia che tocca la nave dovrebbe terminare la partita. In rock.gd, dentro _on_body_entered, la nave è il corpo chiamato Ship. La roccia emette un segnale hit_ship. main.gd lo collega in spawn_rock e termina la partita:
func _on_hit_ship():
$HUD/Message.text = "Game Over"
$Ship.hide()
$Boom.position = $Ship.position
$Boom.emitting = true
get_tree().paused = trueBoom è un CPUParticles2D a emissione singola. Imposta emitting su true e produce un'unica esplosione. È un figlio di Main, che è impostato su Always, quindi continua a funzionare mentre il gioco è in pausa.
Infine, fai in modo che Enter avvii una nuova partita mentre il gioco è in pausa, come in Breakout: togli la pausa, poi chiama reload_current_scene(). Funziona anche dopo una vittoria.
Sfida
MedioTermina la partita quando un asteroide colpisce la nave.
- In
rock.gd, aggiungisignal hit_shiped emettilo quando il corpo è laShip. - In
main.gd, collegalo inspawn_rocka_on_hit_ship, che mostraGame Over, nasconde la nave, fa esplodere$Boomnel punto in cui si trovava e mette in pausa. - Durante la pausa, premi Invio per riprendere e ricaricare la scena.
Premi «Gioca» e vola contro un asteroide: la nave esplode. Poi premi «Verifica».
Provalo tu
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
2Progetto: Sparatutto di asteroidi
Ruotare la naveAccendere il motoreEsercitati da solo: Playground Godot