Deklarowanie i emitowanie
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 36 z 65.
Zadeklaruj sygnał za pomocą słowa kluczowego signal i nazwy, na górze klasy obok jej zmiennych. Nazwa sygnału opisuje zdarzenie, które już się wydarzyło, i jest zapisana w formacie snake_case: died, door_opened, leveled_up. Klasa deklaruje tyle sygnałów, ile potrzebuje:
# player.gd
class_name Player
extends RefCounted
signal leveled_up
signal max_level_reached
const MAX_LEVEL := 3
var level := 1
var xp := 0
func add_xp(amount: int) -> void:
xp += amount
while xp >= 100 and level < MAX_LEVEL:
xp -= 100
level += 1
leveled_up.emit()
if level == MAX_LEVEL:
max_level_reached.emit()Wyemituj sygnał w chwili wystąpienia zdarzenia i tylko wtedy. add_xp(50) na nowym graczu nie emituje niczego. add_xp(250), po którym wartość xp wynosi 300: sygnał leveled_up jest emitowany dwukrotnie, raz na każdy zdobyty poziom, a max_level_reached raz, podczas awansu na poziom 3.
Setter właściwości to dobre miejsce na wyemitowanie sygnału, ponieważ wtedy sygnał jest emitowany niezależnie od tego, jaki kod zmienia wartość:
signal died
var hp: int = 10:
set(value):
var was_alive := hp > 0
hp = maxi(value, 0)
if was_alive and hp == 0:
died.emit()was_alive zapobiega ponownemu wyemitowaniu died, gdy bohater z 0 HP zostanie ponownie trafiony.
Do sygnału można też odwołać się za pomocą jego nazwy zapisanej jako tekst: emit_signal("died") emituje go, hero.connect("died", _on_hero_died) łączy z nim, a hero.has_signal("died") zwraca true. Połączenie z nazwą, której obiekt nie deklaruje, powoduje błąd w chwili wykonania tej linii.
Wyzwanie
ŁatwyNapisz Bomb, która odlicza i sygnalizuje każdy krok.
- Zadeklaruj dwa sygnały:
beepediexploded. tick()zmniejszafuseo1. Jeśli lont nadal ma wartość większą niż0, wyemitujbeeped; jeśli osiągnął0, wyemitujexploded.- Gdy lont osiągnie wartość
0, bomba eksplodowała: kolejne tyknięcia nic nie robią i niczego nie emitują.
Dostarczony kod odczytuje początkową wartość lontu i liczbę tyknięć do wykonania, łączy się z oboma sygnałami według ich nazw i wypisuje Beep oraz BOOM! z połączonych funkcji, a następnie pozostałą wartość lontu. Dla lontu o wartości 3 i 5 tyknięć wypisuje:
Beep
Beep
BOOM!
Fuse: 0Umieść swój kod w pliku bomb.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 bomb := Bomb.new(int(OS.read_string_from_stdin()))
# connect() z nazwą sygnału jako tekstem
bomb.connect("beeped", _on_beeped)
bomb.connect("exploded", _on_exploded)
var ticks := int(OS.read_string_from_stdin())
for i in ticks:
bomb.tick()
print("Fuse: ", bomb.fuse)
func _on_beeped() -> void:
print("Beep")
func _on_exploded() -> void:
print("BOOM!")
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