Specialeffekter och spelutveckling
i Java(TM) - Enklare grafik-animering
av Anibal Wainstein
3.2 Enklare grafik-animering
Vi har hittils bara arbetat med animationer på statusfönster.
Personligen tycker jag att dessa typer av effekter är
irritirande när jag träffar på dem på
nätet. Nu skall vi börja gå igenom enklare
grafikanimering, som är den största styrkan med
Java applets och som gör dem överlägsna andra
effekt-teknologier som t.ex. GIF89 animeringar, DHTML eller
JavaScript.
3.2.1 Trådsynkronisering
Som jag beskrev i avsnitt 3.0 så
måste man vara försiktig med trådar. Ett
exempel på detta kommer vi att upptäcka nu.
Vi har hittills använt oss av paint() metoden för
att rita på appletskärmen. Denna metod anropas
automatiskt av programtråden (huvudtråden) när
skärmen behöver uppdateras. Nu när vi har två
trådar och vi ska börja animera på skärmen
måste vi anropa paint() metoden ett visst antal gånger
per sekund, då är risken stor att huvudtråden
och vår egenskapade tråd kolliderar med varandra.
För att undvika detta så skriver vi ordet synchronized
(synkroniserad) efter public i den överskrivna paint()
metoden:
public synchronized void paint(Graphics g)
{
}
En tråd får inte komma in i metoden om det redan
finns en tråd där inne som arbetar.
Detta är faktiskt allt vi måste göra för
att se till att vår applet inte kraschar p.g.a. trådkollisioner.
3.2.2 Hur man stoppar
grå-flimmer i en applet genom att skriva över update()
metoden
Om vi ska animera med paint() metoden så måste
vi också skriva över update() metoden. Den här
metoden anropas ibland av webbtittaren precis innan den skall
updatera skärmen i syfte att rensa den (med grå
färg). Detta leder till gråflimmer när man
animerar med paint() metoden. Därför måste
den sättas ur spel med följande rader:
public synchronized void update(Graphics g)
{
paint(g);
}
Nu rensar inte update() skärmen utan anropar vår
paint() metod direkt. Som du ser bör denna metod också
vara synkroniserad.
3.2.3 En grafisk textscroller
Nu ska vi göra en applet som liknar den vi gjorde i
avsnitt 3.1.1 men där nu texten
scrollas på appletskärmen.
Gör en kopia av statusscroll.java filen från avsnitt
3.1.1 och ändra init() och run()
metoden till följande:
public void init()
{
meddelande="Grundkurs i specialeffekts- och ";
meddelande+="spelprogrammering i Java(TM)";
}
public void run()
{
while (true)
{
update(getGraphics());
try {Thread.sleep(50);}
catch(InterruptedException e) {}
}
}
Det finns inga konstigheter i init() metoden. Däremot så
har vi nu gjort om vår run() metod så att den fungerar
med den nya uppdateringstekniken. Nu så anropar vi update()
metoden 20 ggr i sekunden (en paus på 50 millisekunder).
Som argument skickar vi Graphics objektet som är kopplat
till appletskärmen och som man kan få med getGraphics()
metoden. Den här metoden kommer i sin tur att anropa paint()
metoden som ser ut så här: public int x=100;
public synchronized void paint(Graphics g)
{
//måla skärmen svart
g.setColor(Color.black);
g.fillRect(0,0,100,20);
//rita ut meddelandet med vit text från position x
g.setColor(Color.white);
g.drawString(meddelande,x,12);
//kolla att x positionen för meddelandet inte
//är mindre än x=-400, om den är det så sätt
//x till positionen 100 (texten syns inte)
if (x<-400) x=100;
//minska x med 1 så att texten rör sig åt vänster
x--;
}
Observera att vi nu har lagt till den nya appletvariabeln
"x" utöver "meddelande" och "programtrad", som redan
fanns i den gamla koden. Den här variabeln håller
reda på textens horisontella position (x-position) även
efter att paint() metoden är färdigexekverad. Den
här positionen börjar med 100 och slutar på
-400. Eftersom appletskärmen bara är 100 pixlar
stor så kommer texten inte att synas i början men
kommer att börja röra sig sakta åt vänster
tills den försvinner helt ur synhåll. Variabeln
"x" kommer då att vara c.a. -400 pixlar och då
är det dags att börja om igen. Detta ser if-satsen
till.
Hur variabeln "x" påverkar textens
position.
Du undrar säkert varför jag skrev 12 på y-positionen
för strängen? Som vi sa i avsnitt 2.1.4
så börjar texten ritas upp från den nedre kanten
och uppåt. Eftersom det är en 12 punkters font så
flyttar jag ner texten med 12 pixlar. Tyvärr kommer detta
inte att fungera med större fonter men vi kommer att gå
igenom en lösning senare.
Titta på textscrollern genom att klicka
här.
Du kommer nog att upptäcka att texten flimrar lite.
Vi kommer i nästa kapitel att gå igenom hur man
slipper detta med hjälp av den välkända dubbelbuffringstekniken.
Nästa sida >>
|