Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny

Spraw, by trafione skały rozpadały się na dwie części.

  1. W rock.gd dodaj signal broken(rock) i wywołaj broken.emit(self), gdy pocisk trafi skałę, przed queue_free().
  2. W main.gd połącz sygnał broken każdej skały z _on_rock_broken w funkcji spawn_rock.
  3. W funkcji _on_rock_broken(rock) utwórz dwie skały, jak pokazano, używając call_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

Poćwicz samodzielnie: Edytor online Godot