Rozbij asteroidy
Część sekcji Projekty ścieżki Godot w Coddy. Lekcja 18 z 36.
Po trafieniu kamień powinien rozpaść się na dwa. Kamień zgłasza swoje rozbicie za pomocą signal broken(rock) i broken.emit(self). self to kamień, więc odbiorca wie, gdzie się znajdował i jak się poruszał.
spawn_rock łączy każdy nowy kamień za pomocą rock.broken.connect(_on_rock_broken), a ta funkcja tworzy dwa kamienie skierowane w różne strony:
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)Sygnał jest wysyłany, gdy Godot sprawdza, które obszary się stykają. Dodanie w tym momencie obszaru zatrzymuje grę komunikatem Can't change this state while flushing queries. call_deferred wykonuje wywołanie pod koniec klatki, gdy jest to bezpieczne.
Na razie każdy kamień rozpada się na dwa, więc nigdy się nie skończą. Następnie zajmiemy się rozmiarami.
Wyzwanie
TrudnySpraw, by trafione skały rozpadały się na dwie części.
- W
rock.gddodajsignal broken(rock)i wywołajbroken.emit(self), gdy pocisk trafi skałę, przedqueue_free(). - W
main.gdpołącz sygnałbrokenkażdej skały z_on_rock_brokenw funkcjispawn_rock. - W funkcji
_on_rock_broken(rock)utwórz dwie skały, jak pokazano, używająccall_deferred.
Naciśnij „Graj” i strzel w skałę: dwie skały rozlecą się w różne strony. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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)
Wszystkie lekcje w sekcji Projekty
2Projekt: Strzelanka z asteroidami
Obróć statekUruchom silnikPoćwicz samodzielnie: Edytor online Godot