Łą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 lambdaGodot 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 += 1Podłą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.
Wyzwanie
ŁatwyStrzelnica ma cele, które po trafieniu emitują sygnał hit. Napisz ScoreBoard, który ich nasłuchuje:
watch(target)łączy sygnałhitcelu 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()dodaje10dopointsi wyświetlaHit! 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: 20Twó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)
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online