Menu
CoddyTech

Absturz und Neustart

Teil des Abschnitts Projekte der Godot-Journey von Coddy. Lektion 21 von 36.

Das Schiff fliegt durch Felsen. Ein Fels, der das Schiff berührt, sollte das Spiel beenden. In rock.gds _on_body_entered ist das Schiff der Körper mit dem Namen Ship. Der Fels 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 einmaliger CPUParticles2D. Setze emitting auf true, und es stößt einmal eine Partikelwolke aus. Es ist ein Kind von Main, das auf „Always“ eingestellt ist, also wird es abgespielt, während das Spiel pausiert ist.

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

Beende das Spiel, wenn ein Fels das Schiff trifft.

  1. Füge in rock.gd signal hit_ship hinzu und sende das Signal, wenn der Körper die Ship ist.
  2. Verbinde es in main.gd in spawn_rock mit _on_hit_ship. Diese Funktion zeigt Game Over an, blendet das Schiff aus, lässt $Boom an seiner Position explodieren und pausiert das Spiel.
  3. Drücke während der Pause die Eingabetaste, um die Pause aufzuheben und die Szene neu zu laden.

Klicke auf „Spielen“ und fliege in einen Fels: Das Schiff explodiert. Klicke dann auf „Prüfen“.

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