PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Applet: Teile des Screens neuzeichnen



BlueJay
12-06-2007, 09:50
Hallo Leute,

Habe mein Progrämmchen in ein Applet umgeschrieben.
Problem: die Graphics-Lib

Und zwar zeichnet die bei jeder Änderung den Screen neu. Das flackert natürlich.

Mit repaint(x0,y0,dx,dy) reduziert sich das Flackern, 9m Konqueror ist es sogar weg, aber z.B. im FF2 flackert es doch noch gewaltig, als ob auch ausserhalb dieses Bereiches der Screen neugezeichnet wird.

Gibt es da Abhilfe?
Und wie?

beteiligter Code:



// wird durch mouseClicked(event) aufgerufen:
public void klick(int mx,int my)
{ int ix,iy;
ix=(mx-xoff)/dx;
iy=(my-yoff)/dy;
if ((iy<ymax) && (ix<xmax) && (spiel_laeuft))
{ cnt++;
repaint(0,ustart,sxmax,symax); // Refresh Anzeigen
turn(ix+xmax*iy); // ruft nach getaner Arbeit show_chip() auf
checkende();
}
else if ((my>ustart) && (mx>sxmax-56)) // Steuerung
{ ix=mx-sxmax+56;
if (ix<16) modus=2; else if (ix<32) modus=3; else modus=4;
neu();
}
}

// updatet Feld, zeichnet einzelne Chips neu (aber eher wohl nicht)
public void show_chip(int nr)
{ int ix=nr%xmax;
int iy=(nr-ix)/xmax;
int xx=ix*dx+xoff;
int yy=iy*dy+yoff;
repaint(xx,yy,dx,dy); // hier zeichnet er wohl doch mehr als 1 Chip neu!
}



Applet:
http://www.gamecraft.de/java/turnit_app/

kompletter AppCode:
http://www.gamecraft.de/java/turnit_app/turnit_app.java
(zeigt zumindest der Konqueror korrekt an)

so long,
BlueJay

Waxolunist
12-06-2007, 11:47
Also bei mir funzt es ganz gut unter windows und ff2.

Was du natürlich noch machen kannst sind Mikrooptimierungen, wie etwa die Importe genauer zu spezifizieren. Das nächste wäre, z.B. mit Rectangles zu arbeiten, damit das Applet mehr im Speicher hält und weniger rechnen muss. Und anstatt einen Mouselistener auf das Applet besser einen Mouselistener für jedes Rectangle.

lg, christian

BlueJay
12-06-2007, 13:46
Also bei mir funzt es ganz gut unter windows und ff2.
Das nächste wäre, z.B. mit Rectangles zu arbeiten, damit das Applet mehr im Speicher hält und weniger rechnen muss. Und anstatt einen Mouselistener auf das Applet besser einen Mouselistener für jedes Rectangle.


Dann geht das Zeichnen schneller?
Mit repaint(ausgesuchte Rechtecke) arbeite ich ja schon. Das Problem ist, dass irgendwie auch ausserhalb des spezifizierten Rechteckes wohl refresht wird. Soll z.B. in der untersten Zeile eine Zelle umgefärbt werden, so flackert in der Bildschirmmitte manchmal was mit.

Leider bin ich noch völlig unbedarft, was das Double Buffering bei Applets angeht.

Einen MouseListener für jedes Rechteck habe ich auch schon mal angedacht, aber verworfen, da es wahrscheinlich ziemlich Ressourcen frisst und als Endprodukt eine Mikro-Anwendung geplant ist.
(Zumindest in JS sind so 200 klickbare Rechtecke beim Aufbau ein kleiner Horror so dass ich in solchen Fällen gerne mit einer einzigen großen, klickbaren Fläche arbeite und über shapes die geklickten Figuren bestimme)

Werde den Gedanken aber im Hinterkopf behalten, wenn das entgültige Zielobjekt für die Anwendung sich als lahme Ente entpuppt.

so long,
BlueJay