bildschirmflackern bei IconImage?

Status
Nicht offen für weitere Antworten.

SBehnen27

Aktives Mitglied
ich stecke gerade in den anfängen eines kleinen Flugzeugspiels.

Inzwischen können meine flieger am himmel umherfliegen usw. das klappt schon alles ganz ok.

allerdings flackert das Iconimage.
Noch schlimmer wird es, wenn ich ein 2. objekt neu zeichne / bewege / wasauchimmer. Dann flimmert nämlich der gesamte bereich zwischen den beiden objekten mit ;()

Das Spielfeld ist ein AWT Dialog, auf dem 4 JLables sind (ja, JLable). in die JLables adde ich die bilder der Flugzeuge.
Code:
    private ImageIcon Iconbl;
    private ImageIcon Iconro;
    private ImageIcon Iconge;
    private ImageIcon Icongr;

        Iconro = new ImageIcon(Flieger[0].getImg());
        Iconro.setDescription(Flieger[0].getImg());
        Iconbl = new ImageIcon(Flieger[1].getImg());
        Iconbl.setDescription(Flieger[1].getImg());
        Iconge = new ImageIcon(Flieger[2].getImg());
        Iconge.setDescription(Flieger[2].getImg());
        Icongr = new ImageIcon(Flieger[3].getImg());
        Iconge.setDescription(Flieger[3].getImg());
        
        rot.setIcon(Iconro);
        blau.setIcon(Iconbl);
        gelb.setIcon(Iconge);
        gruen.setIcon(Icongr);

das neu zeichnen / bewegen der flugzeuge läuft über einen Thread, der die koords der JLables erändert:
Code:
if((Iconro.getDescription()!= Flieger[id].getImg())||(absturz == true)){
            Iconro.setDescription(Flieger[id].getImg());
            rot.setIcon(new ImageIcon(Flieger[id].getImg()));
            }
            rot.setBounds(Flieger[0].getPosX(), Flieger[0].getPosY(), 60, 60);

ich habe nun schon einiges über double buffering gelesen, jedoch noch nie in zusammenhang mit ImageIcons.
Was genau muss nun ge"buffered" werden? einfach mit .setDoubleBuffered(true)?

wenn ich nur die Jlables mit doppelpufferung ausstatte, dann bekomme ich als bonus eigenartige grafikfehler: der transparente hintergrund der flugzeuge schleppt hintergrundgrafiken aus meiner landschaft mit usw.

Wer das mal ersuchen möchte, weil eigeninteresse besteht, der kann gerne meinen bisherigen code haben. so viel isses noch ned ;)
 

SBehnen27

Aktives Mitglied
is auch nur ne notlösung, weil ich nicht rausgefunden habe, wie ich in awt Lables imageicons adde.
Das scheint gar nicht zu gehen.
 

Wildcard

Top Contributor
Wie comp89 schon gesagt hat kann man AWT und Swing nicht mischen.
AWT Labels können keine Icons aufnehmen, du musst die paint-Methode überschreiben und das Bild selbst zeichen.
 

SBehnen27

Aktives Mitglied
hm.
wie is das gemeint "paint methode überschreiben"

welche paint methode überschreiben?
Wenn ich das ohne IconImages mache, sondern ne paint methode wie diese hier:

Code:
public void paint(Graphics g){
        File datei = new File(getImg());
        if (!datei.isFile()){
            setImg("images/system/nopicfound.png");
        }
        bild = Toolkit.getDefaultToolkit().getImage(imgPath);
        g.drawImage(bild, 0, 0, this); 
    }

...nutze, dann wird das transparente gif (flugzeug) nicht transparent, sondern mit weissem hintergrund gemalt.
Ich habe halt hinter meinen fliegern noch nen himmel gebastelt. der soll ja sichtbar bleiben ;)
meintest du das mit paint methode überschreiben?
 

Wildcard

Top Contributor
Ja, sowas meine ich. Aber solche Scherze müssen da unbedingt raus! Die paint ist wirklich NUR zum Zeichnen da!
Code:
        File datei = new File(getImg()); 
        if (!datei.isFile()){ 
            setImg("images/system/nopicfound.png"); 
        } 
        bild = Toolkit.getDefaultToolkit().getImage(imgPath);

Du kannst auch in der paint transparent zeichnen...
 

SBehnen27

Aktives Mitglied
schön wärs.
ich kann machen, was ich will. transparente teile meiner grafiken werden nicht transparent dargestellt.
als iconimage klappts

habs grad noch mal probiert:

in meinem spielfeld folgendes:
Code:
add(Flieger[0]);
Flieger[0].setBounds(100,100,60,60);

in der klasse Flugzeug dann folgendes:
Code:
public void setImg(){
        imgPath = "images/"+farbe+"/"+richtung+".gif";
        bild = Toolkit.getDefaultToolkit().getImage(imgPath);
    }

public void paint(Graphics g){
        g.drawImage(bild, 0, 0, this);
}

die funktion wird ein mal im konstruktor ausgeführt, damit das bild vorhanden ist.
danach wird die methode setImg() immer dann ausgeführt, wenn sich die richtung und somit das darzustellende bild ändert.

Der hintergrund des Fliegers ist ein ödes grau. also nicht transparent ;(
 

SBehnen27

Aktives Mitglied
hehe.
Habs grad mal ausprobiert.
Funktioniert super.
AUSSER: man hat hinter der transparenten grafik ein bild (z.b. den himmel *g*). denn das bild wird transparent gemacht und bekommt dann offensichtlich den hintergrund des Dialogs, auf dem es liegt.

geht also so auch nicht.
 

SBehnen27

Aktives Mitglied
ich habe in meinem letzten spiel (ne art kartenspiel) swing genutzt.
da hatte ich genau die oben beschriebenen probleme, transparente grafiken anzuzeigen.

jedes mal habe ich den hintergrund genau auf der farbe, die auf der darunterliegende frame / dialos /wasauchimmer hat. Ne wirkliche transparenz habe ich bisher nur mit Imageicons erreicht ;)

Hast du ne lösung, wie das mit SWING klappt?
wäre ja kein problem, das eben auf swing umzuändern.
 

SBehnen27

Aktives Mitglied
hey. Danke.

^^

mal im ernst... dass das mit ImageIcons funzt hab ich ja schon oft genug festgestellt...

2 sachen helfen hier nur weiter:

1. flimmerfreie imageicons
2. ein ECHT-transparentes bild. gemalt mit paint()-methode

alles andere is in off-topic vll. besser aufgehoben ;)
 

dotlens

Top Contributor
ein Image wird erst dann geladen wenn es angezeigt werden muss, dies verursacht womöglich das flackern bei dir.
Du kannst deine Images schon vorher laden lassen indem du MediaTracker verwendest...

Java Insel
 

SBehnen27

Aktives Mitglied
das flackern ist inzwischen weg.
hab auf swing umgestellt.
nun ist nur noch die frage nach dem transparenten bild aktuell.
 

SBehnen27

Aktives Mitglied
erledigt.
wenn das zu zeichnende objekt statt von Canvas von JComponent erbt, werden transparenzen berücksichtigt.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben