Silnik gier: kto jest teraz w strefie (Area2D)
Strefy w silniku gier 2D Moonlight Studio od dawna zgłaszały wejścia i wyjścia sygnałem — „ktoś wszedł", „ktoś wyszedł". To świetne do pułapek i checkpointów, ale ogromna część logiki gry potrzebuje czegoś innego: odpytania w danej chwili, kto jest w środku TERAZ.
Pytasz, gdy chcesz
-- obrażenia w promieniu wybuchu, co klatkę
for _, cel in ipairs(mp.bodies_in_area(wybuch)) do
zadaj_obrazenia(cel, 10)
end
-- regeneracja tylko w strefie bezpiecznej
if mp.is_body_in_area(strefa_bezpieczna, gracz) then heal(gracz) end
mp.bodies_in_area(strefa) zwraca listę obiektów aktualnie nakładających się na strefę; mp.is_body_in_area(strefa, obiekt) sprawdza pojedynczy. Bez prowadzenia własnego zbioru na sygnałach — silnik robi to za ciebie.
Pod maską: żywa lista karmiona zdarzeniami
Lista jest utrzymywana z dokładnie tych samych zdarzeń, które emitują sygnały wejścia/wyjścia — więc odpowiedź zapytania jest zawsze spójna z tym, co usłyszał twój handler. Dwa detale, które łatwo przeoczyć, a które psują naiwną implementację:
- Wiele kolizerów jednej strefy. Jeśli strefa składa się z kilku kształtów, obiekt stojący na styku dwóch z nich nie znika z listy, gdy opuści tylko jeden — zliczanie nakładania pilnuje, by wypadł dopiero po wyjściu ze wszystkich.
- Obiekty, które znikają lub się przenoszą. Pocisk skasowany w strefie albo przedmiot podniesiony i przepięty w rękę gracza znikają z listy same — silnik odróżnia „ten sam obiekt wciąż tu jest" od „to już inne wcielenie tego samego identyfikatora". Bez tego lista trzymałaby duchy, których fizycznie w strefie nie ma.
Deterministycznie
Lista zachowuje kolejność wchodzenia, jest czysto runtime'owa (nie zaśmieca zapisanej sceny) i nie zależy od sprzętu — ta sama gra daje tę samą odpowiedź wszędzie.
Co dalej
W kolejce: zapytania obszarem doraźnym (bez stałej strefy — „co jest w tym prostokącie w tej chwili") oraz filtrowanie po warstwach kolizji.