Hem E-böcker Specialeffekter och spelutveckling i Java Enklare grafik-animering

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 >>