Menu
CoddyTech

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.

challenge icon

Aufgabe

Schwer

Lass getroffene Felsen in zwei Teile zerbrechen.

  1. Füge in rock.gd signal broken(rock) hinzu und rufe broken.emit(self) auf, wenn eine Kugel trifft, und zwar vor queue_free().
  2. Verbinde in main.gd in spawn_rock das Signal broken jedes Felsens mit _on_rock_broken.
  3. Erzeuge in _on_rock_broken(rock) wie gezeigt zwei Felsen mit call_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