Menu
CoddyTech

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 = true

Boom è 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.

challenge icon

Sfida

Medio

Termina la partita quando un asteroide colpisce la nave.

  1. In rock.gd, aggiungi signal hit_ship ed emettilo quando il corpo è la Ship.
  2. In main.gd, collegalo in spawn_rock a _on_hit_ship, che mostra Game Over, nasconde la nave, fa esplodere $Boom nel punto in cui si trovava e mette in pausa.
  3. 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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Godot