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 = trueBoom 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.
Aufgabe
MittelBeende das Spiel, wenn ein Fels das Schiff trifft.
- Füge in
rock.gdsignal hit_shiphinzu und sende das Signal, wenn der Körper dieShipist. - Verbinde es in
main.gdinspawn_rockmit_on_hit_ship. Diese Funktion zeigtGame Overan, blendet das Schiff aus, lässt$Booman seiner Position explodieren und pausiert das Spiel. - 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
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