Autor Wątek: [J2ME] Dlaczego wyświetla zła klatkę?  (Przeczytany 1047 razy)

Offline NPS

  • Użytkownik

# Listopad 13, 2010, 00:59:24
Sprite object;

// ...

int tmp = object.getFrame();
object.setFrame(0);
object.paint(graphics);
object.setFrame(tmp);
W założeniu powyższy kod miał wyświetlić pierwszą klatkę z danej sekwencji, nie zmieniając (w ogólnym rozrachunku) klatki obiektu object. Jednak wyświetlona zostaje aktualna (przed tym kodem) klatka, a nie pierwsza. Dlaczego? (Jak usunę z powyższego kodu ostatnią linię, to wyświetla pierwszą, ale wtedy oczywiście zmienia klatkę obiektu.)

Jeśli dałem zbyt mały fragment kodu (bo zachowanie zależy od czegoś jeszcze), to mówcie, wkleję więcej.
« Ostatnia zmiana: Listopad 13, 2010, 01:07:32 wysłana przez NPS »

Offline Mr. Spam

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

Offline Xirdus

  • Redaktor

# Listopad 13, 2010, 01:02:16
Co to jest graphics i co z nim robi paint()?

Offline NPS

  • Użytkownik

# Listopad 13, 2010, 01:06:32
Mam klasę:
class Gra extends GameCanvasa "graphics" to jest to, co zwraca getGraphics() z w/w klasy. paint() powinno wyrysować object na współrzędnych (które object ma wewnątrz siebie zapisane) jakby to powiedzieć... na ekranie identyfikowanym przez "graphics"? :P No idea jest taka, chociaż mogłem coś źle sformułować.

Edit: object to obiekt klasy Sprite, już to dopisałem do pierwszego postu.
« Ostatnia zmiana: Listopad 13, 2010, 01:08:16 wysłana przez NPS »

Offline Xirdus

  • Redaktor

# Listopad 13, 2010, 01:14:14
Prawdopodobną przyczyną jest to, że paint() nie jest rysowaniem jako takim, tylko tak jakby przenosi referencję do tego, co jest zwracane przez getFrame(), a prawdziwe rysowanie odbywa się dopiero przy wyświetlaniu.

Drugą przyczyną mogą być zbytnie optymalizacje.

PS traktuj to co piszę z dystansem, bo pierwszy raz słyszę o GameCanvas, a Javę znam tylko z widzenia. Pomagam ci "na czuja".

Offline Snejk47

  • Użytkownik

# Listopad 13, 2010, 01:18:33
A może rysuje klatkę pierwszą i po chwili tą co była (tmp) i nie widać tej pierwszej?

Offline NPS

  • Użytkownik

# Listopad 13, 2010, 01:26:33
Raczej by było widać, bo obrazek ma elementy przeźroczyste (a animacja to zwykła rotacja, więc byłoby widać, bo coś by wystawało).

Natomiast inna sprawa - rysuję ten sam obiekt (object) w dwóch miejscach na ekranie), tylko w różnej kolejności. I jeśli rysuję tak:
object.setPosition(x1, y1);
int tmp = object.getFrame();
object.setFrame(0);
object.paint(graphics);
object.setFrame(tmp);
object.setPosition(x2, y2);
object.paint(graphics);
[ flushGraphics(); ]
To wszystko jest ok (object na pozycji 1 ma cały czas klatkę 0, a na pozycji 2 się animuje. Ale jak odwrócę kolejność:
object.setPosition(x1, y1);
object.paint(graphics);
object.setPosition(x2, y2);
int tmp = object.getFrame();
object.setFrame(0);
object.paint(graphics);
object.setFrame(tmp);
[ flushGraphics(); ]
To już jest źle, ponieważ obiekt na obu pozycjach się animuje, a powinien tylko na 1. Może to pomoże.