Menu
CoddyTech

Abstürzen und neu starten

Teil des Abschnitts Projekte der Godot-Journey von Coddy. Lektion 18 von 33.

Das Schiff fliegt durch Felsen. Ein Felsen, der das Schiff berührt, sollte das Spiel beenden. In rock.gds _on_body_entered ist das Schiff der Körper namens Ship. Der Felsen sendet ein hit_ship-Signal aus. main.gd verbindet es in spawn_rock und beendet das Spiel:

func _on_hit_ship():
	$HUD/Message.text = "Game Over"
	$Ship.hide()
	$Boom.position = $Ship.position
	$Boom.emitting = true
	get_tree().paused = true

Boom ist ein CPUParticles2D mit einmaliger Auslösung. Setze emitting auf true, und es löst einmal eine Partikelexplosion aus. Es ist ein Kind von Main, dessen Prozessmodus auf Always eingestellt ist, sodass es auch während des pausierten Spiels abgespielt wird.

Zum Schluss soll Enter wie in Breakout ein neues Spiel starten, während das Spiel pausiert ist: Hebe die Pause auf und rufe dann reload_current_scene() auf. Das funktioniert auch nach einem Sieg.

challenge icon

Aufgabe

Mittel
  1. Füge in rock.gd signal hit_ship hinzu und löse es aus, wenn der Körper das Ship ist.
  2. Verbinde es in main.gd in spawn_rock mit _on_hit_ship. Dadurch wird Game Over angezeigt, das Schiff ausgeblendet, $Boom an der Stelle ausgelöst, an der sich das Schiff befand, und das Spiel pausiert.
  3. Während das Spiel pausiert ist, hebt die Eingabetaste die Pause auf und lädt die Szene neu.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Godot-Playground