Die Felsen spalten
Teil des Abschnitts Projekte der Godot-Journey von Coddy. Lektion 16 von 33.
Ein großer Fels sollte sich in zwei kleine Felsen teilen. Gib jedem Felsen eine size, 2 für einen großen und 1 für einen kleinen. Setze in rock.gds _ready scale = Vector2.ONE * size * 0.5.
Der Fels meldet mit signal broken(rock) und broken.emit(self), dass er zerbrochen ist. self ist der Fels. spawn_rock nimmt jetzt eine Größe entgegen und verbindet das Signal:
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)Das Signal trifft ein, während Godot prüft, welche Bereiche sich berühren. Wird dann ein Bereich hinzugefügt, stoppt das Spiel mit der Meldung Can't change this state while flushing queries. call_deferred führt den Aufruf am Ende des Frames aus, wenn das sicher ist.
Aufgabe
Schwer- Füge in
rock.gdvar size = 2undsignal broken(rock)hinzu. Lege die Skalierung in_readyanhand vonsizefest. Sendebrokenmitself, wenn ein Geschoss trifft. - Sorge in
main.gddafür, dassspawn_rock(where, velocity, size)diesizedes Felsens festlegt und dessen Signalbrokenverbindet. Die ersten 4 Felsen haben die Größe 2. - Wenn ein Felsen der Größe 2 zerbricht, erzeuge dort mit
call_deferredzwei Felsen der Größe 1. Ihre Geschwindigkeiten entsprechen der alten Geschwindigkeit, gedreht um0.8beziehungsweise-0.8und multipliziert mit1.5.
Probier es selbst
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
2Projekt: Asteroiden-Shooter
Das Schiff drehenDen Antrieb zündenÜbe selbstständig: Godot-Playground