Animacje / Delay / Dynamiczność konsoli w Rubim

Witam! Robię grę w konsoli, przygodówkę/rpg. Przydałby mi się patent… graliście kiedyś w sidescrollery? Gry co bije się stworki i idzie w prawo. No więc na końcu każdej planszy było naliczanie punktów. Dosłownie naliczanie, bardzo szybka animacja pokazująca wzrost wartości punktów. Czy jest coś takiego wykonalne w Rubim, w konsoli?

Teoretycznie dało by się to zrobić z pomocą jakiejś funkcji opóźniającej, ale wtedy dla każdego punkta naliczonego pokazywałby się nowy tekst, chyba, że by czyścić konsolę, ale to mało wydajne.

Generalnie chodzi o dynamiczną zmianę tekstu.

Albo “wymieniasz” całą linijkę, albo ncurses (jest dobry binding dla rubiego, choć z dość kiepską dokumentacją – ale to praktycznie 1:1 API ncurses dla C)

Jak można by wymienić całą linijkę? Bo znam tylko funkcję system(‘cls / clear’), już pomijając, że jest to funkcja terminala windowsa / linuxa, a nie Rubiego, to czyści całą konsolę, a nie jedną linijkę. Bo na razie staram się nie korzystać z bibliotek.

Okej znalazłem coś takiego

0.step(100, 10) do |i| printf((i < 100 ? "\rProgress: %02d\%" : "\rProgress: %3d\%"), i) $stdout.flush sleep(1) end puts
Z tego co widzę generalnie rozchodzi się o printf + \r w stringu a także funkcję sleep, a $stdout.flush dodatkowo odświeża tak, aby było płynne przejście, tak?

Ale może macie lepsze propozycje

Dokładnie to, jeśli nie chcesz wchodzić w ncurses – czyli \r jako powrót do początku linii.

A dlaczego \r nie działa z puts? Bo to mnie zastanawia :slight_smile:

Puts sam z siebie dodaje \n na końcu.

O tym to wiedziałem, ale nie znalazłem powiązania. Dzięki wielkie

Pozdrawiam