13.07.2026 18:21

Silnik gier 2D: animacje równoległe w sekwencjach — krok „naraz”

⏱️ 3 min czytania
Udostępnij:

Niedawno silnik gier 2D w Moonlight Animate dostał mp.tween_sequence — scenariusz kroków animacji wykonywanych po kolei. Kroki były sekwencyjne: najpierw jeden, potem następny. Brakowało jednej, bardzo częstej rzeczy: zrobić kilka animacji naraz i poczekać, aż wszystkie się skończą.

Teraz jest — krok równoległy (join).

Kilka animacji jednocześnie, jedna bariera

-- Wjazd panelu: pozycja I krycie animują się RAZEM, potem (po chwili) zanik
mp.tween_sequence(panel, {
  { parallel = {
      { prop='y',       to=0, dur=0.3, easing='ease-out' },
      { prop='opacity', to=1, dur=0.3 },
  }},
  { wait = 1 },
  { parallel = {
      { prop='opacity', to=0, dur=0.3 },
  }},
})

Krok {parallel={...}} startuje wszystkie swoje animacje w tej samej chwili i traktuje je jako jedną całość: przechodzi do następnego kroku dopiero, gdy wszystkie dobiegną końca. To jest dokładnie ta „bariera synchronizacji”, której nie dało się wyrazić samymi krokami sekwencyjnymi.

Po co to, skoro można odpalić dwie animacje osobno?

Pojedynczy ruch po skosie (x i y jednocześnie) dało się zrobić i wcześniej — dwie niezależne animacje na różnych właściwościach nie kolidują. Prawdziwą, niewyrażalną wcześniej wartość daje bariera w środku scenariusza:

  • „Przesuń x + y + skalę razem, DOPIERO POTEM zmień kolor” — następny krok ma czekać na komplet, nie na jedną z animacji. Bez kroku równoległego trzeba by żonglować callbackami i ręcznie liczyć, która skończyła ostatnia.
  • Wszystko dalej pod jednym uchwytemmp.stop_sequence zatrzymuje cały scenariusz razem z wszystkimi równoległymi animacjami naraz.

Detale, które pilnują poprawności

  • Różne czasy → czeka na najdłuższy. {parallel={ x(0.5s), y(1.0s) }} trzyma krok przez pełną sekundę; krótsza animacja po prostu kończy wcześniej i czeka na rodzeństwo.
  • Mieszanie źródeł. W jednej grupie można łączyć animacje właściwości wbudowanych (prop='x') i wartości z tablicy węzła (key='mana').
  • Ta sama właściwość dwa razy w grupie jest scalana (wygrywa ostatnia) — żeby dwie animacje nie walczyły o ten sam kanał i nie zawiesiły kroku.
  • Reużywa istniejące animacje — każdy element grupy to zwykły tween: te same krzywe wygładzania, te same typy właściwości, ta sama determinacja. Pauza gry zamraża cały krok; zatrzymanie sekwencji ubija wszystkie animacje grupy; zniknięcie węzła w trakcie porzuca krok bez sierot.

Zastosowania

Wjazdy/wyjścia paneli HUD (pozycja + przezroczystość razem), efekty „pop” przycisków (skala + obrót naraz), skryptowane kamery (najazd + zoom jednocześnie, potem trzymaj), złożone animacje postaci w cutscenkach. Wszędzie, gdzie kilka rzeczy ma się dziać w tym samym czasie, a scenariusz ma poczekać na ich komplet — kolejny mały, ale porządkujący klocek dokładany do silnika gier 2D w Moonlight Animate.

📚 Powiązane posty

14.07.2026 22:19

Silnik gier: od szablonu do grywalnej gry RPG top-down

Startowy szablon silnika gier to teraz kompletny, grywalny wycinek gry RPG top-down: chodzenie po siatce, rozmowy z postaciami, przeciwnik goniący gdy...
Czytaj dalej →
14.07.2026 19:16

Moonlight Animate — system dialogów w grach

Silnik gier 2D w Moonlight Animate ma teraz kompletny system dialogów: kwestie z efektem maszyny do pisania, wybory z warunkami, zmienne fabularne i g...
Czytaj dalej →
14.07.2026 18:40

Moonlight Animate: ruchoma panorama dźwięku także w wyeksportowanym wideo

Dźwięk przejeżdżający z lewego do prawego głośnika brzmiał dobrze w podglądzie, ale eksport przez serwer zamrażał go w miejscu. Ostatnia luka parytetu...
Czytaj dalej →

📧 Bądź na bieżąco!

Zapisz się na listę oczekujących, aby otrzymywać powiadomienia o nowych postach na Dev Blog oraz informacje o starcie platformy Moonlight.