Proste animacje
Wątki można wykorzystać do tworzenia prostych animacji.
1. Najprostszy sposób na tworzenie animacji to stworzenie wątku zmieniającego wartość zmiennej wykorzystywanej przez metodę paint().
Np. wątek w pętli nieskończonej zmienia wartość zmiennych x i y, a metoda paint(Graphics g) zawiera jedynie: g.fillOval(x,y, r ,r):
Kod apletu: Anim1.java
2. Pokazana powyżej metoda tworzenia animacji nie jest optymalna. Można zaobserwować migotanie. Migotanie wynika z tego, że wywołąnie metody repaint() czyści ekran przy pomocy metody uptade(), a następnie wywołuje ponownie metodę paint(). Migotanie było bardziej widoczne, gdyby w metodzie paint() rysowane było więcej elementów.
Rozwiązaniem tego problemu może być "buforowanie" przy pomocy klasy Image. W taki przypadku wątek powodował by zmianę zawartości graficznej obiektu klasy Image, a metoda paint() rysowałaby jedynie ten obiekt.
Kod apletu: Anim2.java
Wykorzystując buforowanie można tworzyć wieloelementowe animacje pozbawione efektu migotania:
3. Ciekawe efekty można również uzyskać wczytując sekwencję obrazów z plików graficznych. Przykładowo używając pięć prostych plików jpg:
można uzyskać animację podobną do "pac-mana".
W tym celu można utworzyć tablicę obiektów klasy Image, zawierającą wszystkie obrazy, a w metodzie run() wątku sekwencyjnie wczytywać te obrazy.
Kod apletu: Pac.java i opis jego najważniejszych elementów:
Deklaracja tablicy obrazów klasy Image: Image[] a = new Image[5];
Wczytanie obrazów do tablicy: a[0] = getImage(getCodeBase(), "1.jpg"); a[1] = getImage(getCodeBase(), "2.jpg"); a[2] = getImage(getCodeBase(), "3.jpg"); a[3] = getImage(getCodeBase(), "4.jpg"); a[4] = getImage(getCodeBase(), "5.jpg");
Dodawanie obrazu (klasy Image) do grafiki gc (Graphics): gc.drawImage(a[i], x*4, y, 64, 61, this);
Oczywiście efekt "pac-mana" można uzyskać w bardziej efektywny sposób poprzez odpowiednie wykorzystanie metody fillArc klasy Graphics (przykładowy kod: Pac2.java). Celem tego przykładu było pokazanie jak w prosty sposób można zrobić animacje z dowolnych obrazów/zdjęć wczytywanych z zewnątrz.
|