Menu
CoddyTech

Łączenie z sygnałami

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 37 z 65.

connect() przyjmuje funkcję do uruchomienia jako Callable. Podaj nazwę metody bez nawiasów lub zapisz lambdę:

chest.opened.connect(_on_chest_opened)          # metoda tego skryptu
chest.opened.connect(quest_log.add_entry)       # metoda innego obiektu
chest.opened.connect(func(): print("Creak!"))   # funkcja lambda

Godot nazywa metodę nasłuchującą _on_, następnie nadawcę, a potem sygnał: _on_chest_opened. Sygnał może mieć wiele podłączonych funkcji, które są uruchamiane w kolejności, w jakiej zostały podłączone.

Obiekt, który nasłuchuje, zwykle sam się łączy w metodzie, która otrzymuje emiter:

# quest_log.gd
class_name QuestLog
extends RefCounted

var chests_opened := 0

func track(chest: Chest) -> void:
	if not chest.opened.is_connected(_on_chest_opened):
		chest.opened.connect(_on_chest_opened)

func untrack(chest: Chest) -> void:
	if chest.opened.is_connected(_on_chest_opened):
		chest.opened.disconnect(_on_chest_opened)

func _on_chest_opened() -> void:
	chests_opened += 1

Podłączenie tej samej funkcji do tego samego sygnału dwa razy jest błędem, podobnie jak odłączenie funkcji, która nie jest podłączona. is_connected() najpierw sprawdza połączenie. disconnect() przestaje nasłuchiwać, a przy następnym wyemitowaniu sygnału ta funkcja nie zostanie już uruchomiona.

Przekaż CONNECT_ONE_SHOT jako drugi argument, a po pierwszym wywołaniu połączenie usunie się samo: chest.opened.connect(_on_first_open, CONNECT_ONE_SHOT).

Lambdę zapamiętują wartość, jaką miała zmienna lokalna w chwili utworzenia lambdy. count += 1 wewnątrz podłączonej lambdy zmienia tę kopię, a count w _ready() pozostaje równe 0. Przechowuj licznik w zmiennej składowej obiektu nasłuchującego, tak jak robi to QuestLog.

challenge icon

Wyzwanie

Łatwy

Strzelnica ma cele, które po trafieniu emitują sygnał hit. Napisz ScoreBoard, który ich nasłuchuje:

  • watch(target) łączy sygnał hit celu z _on_target_hit. Nasłuchiwanie celu, który jest już nasłuchiwany, niczego nie zmienia.
  • ignore(target) rozłącza sygnał. Zignorowanie celu, który nie jest nasłuchiwany, niczego nie zmienia.
  • _on_target_hit() dodaje 10 do points i wyświetla Hit! Score: N.

Dwukrotne rozpoczęcie nasłuchiwania lub zignorowanie celu, którego się nie nasłuchuje, nie może powodować błędu, ponieważ każdy błąd powoduje niezaliczenie testu. Plik target.gd jest kompletny.

Dostarczony kod odczytuje liczbę celów, a następnie polecenia takie jak watch 0, ignore 0 i shoot 0, po czym wyświetla końcowy wynik. Dla dwóch celów i poleceń watch 0, shoot 0, shoot 1, watch 1, watch 1, shoot 1, ignore 0, shoot 0 wyświetla:

Shot target 0
Hit! Score: 10
Shot target 1
Shot target 1
Hit! Score: 20
Shot target 0
Final score: 20

Twój kod umieść w plikach score_board.gd i target.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	var board := ScoreBoard.new()
	var targets: Array[Target] = []
	for i in int(OS.read_string_from_stdin()):
		targets.append(Target.new())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var target := targets[int(parts[1])]
		if parts[0] == "watch":
			board.watch(target)
		elif parts[0] == "ignore":
			board.ignore(target)
		else:
			print("Shot target ", parts[1])
			target.shoot()
	print("Final score: ", board.points)
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online