JPG/PNG wird nicht gezeichnet

timestamp

Mitglied Käsekuchen
Hallo Tutorials.de,

nach langer Zeit tauche ich mal wieder mit einer Frage auf. Ich habe vor ein 2D Spiel das bislang nur aus Rechtecken bestand durch Grafiken aufzupeppen. Es scheitert leider nur schon am Hintergrund. Der wird nämlich scheinbar nur einmal gezeichnet (alle nachfolgenden Zeichenoperationen werden nicht übermalt und folglich entsteht ein ziemlicher Salat).
Java:
public void draw(){
	Graphics2D g = (Graphics2D) buffer.getDrawGraphics();
	//Lasse ich das clearRect weg, erscheint das Bild, aber übermalt nichts
	g.clearRect(0, 0, width, height);
	drawBackground(g);
	drawGameObjects(g);			
        g.dispose();
        buffer.show();
}
Java:
public void drawBackground(Graphics2D g){		
	g.drawImage(background, 0, 0, width, height, Color.black, this);		
}
Java:
mt = new MediaTracker(this);		
background = Toolkit.getDefaultToolkit().createImage("../graphics/map.jpg");
mt.addImage(background, 0);
try{
	mt.waitForAll();
}
catch(InterruptedException e){}
 

genodeftest

Erfahrenes Mitglied
So weit ich weiß solltest du im Fall von Klassen, die von JComponent erben, zuerst super.paintComponent() aufrufen. Siehe dazu auch „Performing Custom Painting“ aus „The Really Big Index“, http://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html

Zur Not würde es auch ein clearRect() tun, das könnte aber mit Transparenzen/etc. Probleme machen. Wobei du ein Spiel wohl eher nicht transparent haben willst ;)
 

Fabio Hellmann

Erfahrenes Mitglied
Hi,
ich würde dir empfehlen, deinen buffer vor .show() abzufragen, ob der Content verloren gegangen ist:
Java:
public void draw(){
    Graphics2D g = (Graphics2D) buffer.getDrawGraphics();
    //Lasse ich das clearRect weg, erscheint das Bild, aber übermalt nichts
    g.clearRect(0, 0, width, height);
    drawBackground(g);
    drawGameObjects(g);         
    g.dispose();
    if(!buffer.contentsLost()) {
        buffer.show();
    }

    // Manche Systeme haben ein Problem mit der Syncronization des Screens. Deshalb diese Zeile ausführen
    Toolkit.getDefaultToolkit().sync();
}
Bei jedem Betriebssystem läuft die Syncronization des Screens ein wenig unterschiedlich ab, deshalb gibt es einen explizieten Sync mit 'Toolkit.getDefaultToolkit().sync()'. Bei mir (Win7) hat es auch ohne diese zusätzliche Zeile funktioniert.

Und den ImageObserver würde ich mal auf 'null' setzen.
Java:
public void drawBackground(Graphics2D g){       
    g.drawImage(background, 0, 0, width, height, Color.black, null);        
}

Gruß

Fabio
 

timestamp

Mitglied Käsekuchen
Moin moin,

Danke für die Antworten, der ImageObserver scheint es gewesen zu sein :) Ich bedanke mich ganz herzlich, jetzt kann es endlich weiter gehen.

Um die Frage noch zu beantworten: Ich arbeite mit Swing.
 

Neue Beiträge