13.07.2026 19:25

Silnik gier 2D: dźwięk, który słyszysz z właściwej strony — audio pozycyjne

⏱️ 3 min read
Share:

Do tej pory dźwięki w silniku gier 2D w Moonlight Animate grały „płasko" — z tą samą głośnością i po środku, niezależnie od tego, gdzie w świecie był ich emiter. Teraz doszło audio pozycyjne (spatial 2D): źródło dźwięku umiejscowione w świecie cichnie z odległością od kamery i panuje w lewo/prawo wedle tego, po której stronie ekranu się znajduje.

Dwa sposoby użycia

1. Węzeł, który sam się aktualizuje. Ustaw na węźle AudioPlayer2D tryb pozycyjny — jego głośność i panorama są przeliczane co klatkę na podstawie pozycji węzła względem aktywnej kamery (słuchacza). Idealne dla ruchomych, ciągłych źródeł: przejeżdżający samochód, buczący generator, wodospad w tle. Gdy oddalasz kamerę — dźwięk cichnie; gdy źródło przesuwa się na prawo — słyszysz je bardziej z prawej.

-- (w scenie: AudioPlayer2D z positional=true, maxDist=600, panRange=400)
-- Nic więcej nie trzeba — silnik sam aktualizuje głośność i panoramę.

2. Strzał „w miejscu". mp.play_sound_at(ścieżka, x, y) odpala jednorazowy dźwięk w konkretnym punkcie świata — parametry przestrzenne liczone raz, w chwili odpalenia. Idealne dla zdarzeń: wybuch, trafienie, brzęk monety tam, gdzie coś się właśnie stało.

mp.play_sound_at("explosion.ogg", wybuch_x, wybuch_y)   -- głośność i strona wg pozycji kamery

Jak to liczy

  • Tłumienie liniowe: pełna głośność w promieniu minDist, potem równomierny spadek do zera przy maxDist. Prosto, przewidywalnie i deterministycznie — ta sama scena brzmi zawsze tak samo.
  • Panorama: zależna od poziomego przesunięcia względem słuchacza; osiąga skrajne lewo/prawo przy zadanym panRange (osobnym od zasięgu głośności, żeby dźwięk najpierw „przeszedł" na bok, a dopiero potem zniknął).
  • Słuchacz = aktywna kamera. Pozycja odsłuchu to środek bieżącej kamery świata. Gdy scena nie ma aktywnej kamery, dźwięk gra bez spatializacji (na swojej bazowej głośności) — żadnych niespodzianek.
  • Odporność: skrajne przypadki (zerowy zakres, śmieciowe wartości) są bezpiecznie obcinane — brak dzielenia przez zero, brak trzasków.

Detale inżynierskie

Rdzeń przestrzenny to czysta funkcja matematyczna (pozycja słuchacza + emitera → głośność i panorama), w pełni pokryta testami jednostkowymi niezależnie od warstwy audio. Wybór „aktywnej kamery" to jedna współdzielona funkcja używana zarówno przez audio, jak i przez system paralaksy — zamiast trzech kopii tej samej logiki. Nowe właściwości węzła zapisują się w scenie tylko gdy odbiegają od domyślnych, więc stare sceny pozostają bajtowo identyczne (pełna zgodność wsteczna).

Kolejny klocek dokładany do silnika gier 2D w Moonlight Animate — tym razem taki, który słychać.

📚 Related posts

27.08.2026 20:55

Data, której nie cofniemy nawet my

Każdy certyfikat autorstwa dostaje datę zapisaną w blockchainie Bitcoina — takiej nie podważy nikt, my też nie. Sprawdzisz ją bez konta i bez Moonligh...
Continue reading →
27.08.2026 19:35

Twój kolor, wszędzie

Trzy tryby i siedem akcentów, wspólnych dla strony i Moonlight Animate. Motyw jedzie z kontem, profil pokazuje gościom Twoje kolory, a harmonogram sam...
Continue reading →
27.08.2026 18:31

Kto moderuje i na jakiej podstawie

Moderator to teraz osobna rola z własnym zakresem, a nie administrator w przebraniu. Odrzucenie treści wymaga powodu, który trafia do autora razem z d...
Continue reading →

📧 Stay up to date!

Join the waitlist to get notified about new Dev Blog posts and Moonlight platform launch.