Die Felsen teilen
Teil des Abschnitts Projekte der Godot-Journey von Coddy. Lektion 18 von 36.
Ein beschossener Felsbrocken sollte sich in zwei Teile spalten. Der Felsbrocken meldet mit signal broken(rock) und broken.emit(self), dass er zerbrochen ist. self ist der Felsbrocken, daher weiß der Listener, wo er war und wie er sich bewegt hat.
spawn_rock verbindet jeden neuen Felsbrocken mit rock.broken.connect(_on_rock_broken), und diese Funktion erzeugt zwei Felsbrocken, die sich voneinander wegdrehen:
func _on_rock_broken(rock):
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)Das Signal trifft ein, während Godot überprü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.
Vorerst spaltet sich jeder Felsbrocken, sodass sie nie ausgehen. Als Nächstes kommen die Größen.
Aufgabe
SchwerLass getroffene Felsen in zwei Teile zerbrechen.
- Füge in
rock.gdsignal broken(rock)hinzu und rufebroken.emit(self)auf, wenn eine Kugel trifft, und zwar vorqueue_free(). - Verbinde in
main.gdinspawn_rockdas Signalbrokenjedes Felsens mit_on_rock_broken. - Erzeuge in
_on_rock_broken(rock)wie gezeigt zwei Felsen mitcall_deferred.
Drücke „Spielen“ und schieße auf einen Felsen: Zwei Felsen fliegen auseinander. Drücke dann „Prüfen“.
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)
Alle Lektionen in Projekte
Übe selbstständig: Godot-Playground