Autor Wątek: Animacje  (Przeczytany 2628 razy)

Offline AndrzejKrl

  • Użytkownik

# Grudzień 31, 2013, 00:26:38
Mam problem z animacjami. Chodzi o to, że napisałem poruszanie się postaci. Wszystko pięknie działa. Ale pomyślałem, że dodam interpolację (płynne poruszanie się po kratkach). I tu zaczyna się problem. Gdyż wcześniejsze malowanie w głównej pętli nie działa poprawnie. Pomyślałem, że może dodam zmienna (czy postać się porusza) a następnie sprawdze w warunku czy postać ma być malowana w ruchu czy stojącą. Niestety to także nie jest najlepsze rozwiązanie, gdyż do poprawnego działania musze wszystkie rysowania (tj. grafiki wyświetlane nad postacią) zawrzeć w pętli animacji. Wiem, że nie jest to dobre rozwiązanie, dlatego proszę was o pomoc. A i jeszcze jedno. Gdy dodałem tą interpolacje, to zauważyłem nieco większe zużycie procesora, zdaję sobie sprawę, że to może być wina tego ciągłego rysowania. Proszę o jakieś rady i wskazówki.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Estivo

  • Użytkownik
    • Blog

# Grudzień 31, 2013, 01:23:16
Nie wiem dokładnie co masz na myśli mówią interpolacje.

Offline AndrzejKrl

  • Użytkownik

# Grudzień 31, 2013, 13:47:06
Płynne poruszanie się z kafelka na kafelek.

Każda animacja trwa w czasie. Mamy pozycje początkową i końcową. Np. Przesuwamy się z kafelka X=1 na kafelek X=2. Normalnie bez interpolacji to rysujemy ludka na pozycji pierwszej, a później na drugiej. Brak efektu przejścia.

Interpolacja działa w taki sposób, że mamy dodatkowo rysowany moment przejścia ludka z kafelka na kafelek. Czyli wyliczamy sobie przesuniecie w czasie animacji. Rysujemy położenie ludka w zmieniającym się czasie, aż nie dojdzie do wyznaczonego pola.

Myślę, że jasno sie wyraziłem.

Jednak nadal nie wiem jak sie odpowiednio do tego zabrać.

Może jakieś sugestie jak zabrać się do tematu animacji?

Offline Estivo

  • Użytkownik
    • Blog

# Grudzień 31, 2013, 14:11:38
Teraz lepiej ;) zrobił bym tak mniej więcej
jeżeli animacja.end != true
{
animacja.klatka++;
animacja.update();
player.offset++;
}
jeżeli inaczej
{
animacja.reset();
player.pos.x ++;
}

offset - to pixel kiedy koleś przechodzi, czyli pozycja sprite tymczasowa. update() sprawdza czy klatka to ostatnia i coś tam jeszcze co chcesz.

Offline ArekBal

  • Użytkownik

# Grudzień 31, 2013, 14:30:01
Trochę abstrakcji nie zaszkodzi.

Kilka obiektów by ci się przydało...
Masz ludzika, on ma swoją pozycję na kaflach...

On ma pozycję na planszy (uwzględniającą przejście pomiędzy kafelkami). Tej informacji potrzebujesz by w dobrym miejscu odrysować te "grafiki wyświetlane nad postacią" .

Offline AndrzejKrl

  • Użytkownik

# Grudzień 31, 2013, 15:49:36
Zrobiłem to tak, że mam zmienną odpowiedzialna za przechowanie informacji w którą stonę nastąpił ruch. Dzięki temu wiem czy trzeba + czy - pozycje kafelkową aby "odświeżyć" potrzebną część mapy. Działa znakomicie.

Problem zaczyna się gdy jest wyświetlone coś nad ludkiem, tzn. np. HUD. Wtedy znowu musze jemu odpowiednie pozycje "odświeżyć".

I tu jest główny problem myślowy. Musze odswieżać prawie cały czas grafike, żeby to dobrze wyglądało (grafika wyświetlana warstwowo na wyświetlacz).

Wtedy też odnotowuję większe zużycie procesora, bo tak 10%. Jest to strasznie dużo, zwłaszcza, że nie jest to super rozbudowana gra 3d, gdzie musiałby by renderowany każdy ruch, mrugnięcie oka, czy inne temu podobne.
« Ostatnia zmiana: Grudzień 31, 2013, 15:55:32 wysłana przez AndrzejKrl »

Offline ArekBal

  • Użytkownik

# Grudzień 31, 2013, 16:07:20
Powinieneś oddzielić wyświetlanie od "modelu".
Niech model się aktualizuje gdy tego potrzebuje.

Jak rysujesz to tylko raz na klatkę.

O jakim wyświetlaczu tutaj mówimy?

Offline AndrzejKrl

  • Użytkownik

# Grudzień 31, 2013, 16:43:39
ALLEGRO_DISPLAY

Ale myśle, że zrobie tak: dam 3 warstwy-bitmapy na których będzie rysowane.
1.  Wszystko nad
2. Ludek
3. Wszystko pod

Myślę, że może pozwoli mi to tylko na aktualizacje warstwy 2. a pozostałe zostaną niezmienne.
« Ostatnia zmiana: Grudzień 31, 2013, 16:45:19 wysłana przez AndrzejKrl »