Czym jest sygnał?
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 35 z 65.
Podczas gry z obiektami dzieją się różne rzeczy: moneta zostaje zebrana, drzwi się otwierają, a hp bohatera spada do 0. Inne części programu reagują na te zdarzenia: wynik rośnie, odtwarzany jest dźwięk, pojawia się ekran końca gry.
Sygnał to wiadomość wysyłana przez obiekt, gdy coś mu się przydarzy. Obiekt emituje sygnał, a każda funkcja połączona z tym sygnałem zostaje uruchomiona:
# coin.gd
class_name Coin
extends RefCounted
signal collected
func collect() -> void:
print("Coin picked up")
collected.emit()signal collected deklaruje sygnał, a collected.emit() go wysyła. Moneta nie wie, kto nasłuchuje. Kod, który interesuje się monetami, łączy jedną ze swoich funkcji z sygnałem:
# main.gd
func _ready():
var coin := Coin.new()
coin.collected.connect(_on_coin_collected)
coin.collect()
print("Done")
func _on_coin_collected() -> void:
print("Score +1")Wynikiem jest Coin picked up, Score +1, Done. Emisja od razu uruchamia połączone funkcje, przed wierszem następującym po emit(). Sygnał bez połączonych funkcji nic nie robi, gdy zostaje wyemitowany.
Bez sygnału collect() musiałoby samo wywoływać kod punktacji, więc każda moneta musiałaby mieć odniesienie do tablicy wyników. Dzięki sygnałowi moneta jedynie ogłasza zdarzenie, a dowolna liczba nasłuchujących — lub żaden — może na nie zareagować.
Własne węzły Godota działają tak samo: Button emituje sygnał pressed, gdy zostanie kliknięty, a Timer emituje sygnał timeout, gdy upłynie jego czas.
Wyzwanie
ŁatwySkrzynka pocztowa informuje o nowej poczcie za pomocą sygnału. Mailbox już deklaruje signal mail_arrived i ma licznik letters. Napisz deliver(kind):
- Gdy
kindma wartość"letter", dodaj1dolettersi wyemitujmail_arrived. - Każdy inny rodzaj (reklama, ulotka) jest wyrzucany: nic się nie zmienia i nic nie jest emitowane.
Dostarczony kod łączy funkcję, która wyświetla You've got mail!, a następnie odczytuje, ile wierszy następuje dalej, i dostarcza każdy z nich. Wiersz away rozłącza tę funkcję, a home łączy ją ponownie, więc list, który nadejdzie podczas twojej nieobecności, zostanie policzony, ale nie zostanie ogłoszony. Dla wierszy letter, ad, away, letter wyświetla:
Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2Twój kod umieść w pliku mailbox.gd. 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 mailbox := Mailbox.new()
mailbox.mail_arrived.connect(_on_mail_arrived)
var count := int(OS.read_string_from_stdin())
for i in count:
var line := OS.read_string_from_stdin()
if line == "away":
mailbox.mail_arrived.disconnect(_on_mail_arrived)
elif line == "home":
mailbox.mail_arrived.connect(_on_mail_arrived)
else:
print("Delivering: ", line)
mailbox.deliver(line)
print("Letters: ", mailbox.letters)
func _on_mail_arrived() -> void:
print("You've got mail!")
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