Bilder auf Bilder zeichnen

JUserToto

Aktives Mitglied
Hallo zusammen,

ich studiere zur Zeit Informatik. Dort lernt man zwar relativ schnell all die technischen Feinheiten von Java, Swing wird allerdings etwas vernachlässigt. Ich möchte mich also selbst ein wenig schlauer auf dem Gebiet machen.
Deswegen habe ich mir eine Herausforderung gesetzt. Ich möchte eine kleine Adventure-Engine schreiben.
Nichts großartiges, man soll bloß Dinge nehmen und benutzen können.

Die Technik ist fertig und als Textadventure kann ich die Spiele ausgeben. Nun wollte ich das ganze mit Swing realisieren und werde langsam bekloppt.

Zur Programmstruktur:

Ich habe einen JFrame. Momentan ohne Layout. Er besteht aus:
- Einem JPanel. Hier wird die ganze Szenerie gemalt (Hintergrundbild + Objekte, die man benutzen oder nehmen kann).
- Einem JLabel. Es dient dazu, Gespräche darzustellen. Wenn ich also auf einen Schlüssel in der Szene mit Rechtsklick drücke steht dort für eine gewisse Zeit "Das ist ein Schlüssel" oder so etwas.

Das JPanel basiert nun auf einer Klasse Game, die alle Informationen über das Spiel sammelt. Zum Beispiel die aktuelle Szene. Eine Szene hat natürlich ein Hintergrundbild, dass auf den JPanel gezeichnet wird.

Ein größeres Problem ist es nun für mich, die einzelnen Szenerieobjekte darzustellen.
Ich wollte sie zunächst einfach über das Hintergrundbild malen. Das klappt aber nicht, weil diese Objekte ja anklickbar sein müssen. Also erzeuge ich für jedes Szenerieobjekt ein Objekt einer Klasse SceneryComponent mit der Größe des Bildes des Szenerieobjektes. Auf diese Komponente wird das Bild gezeichnet.
Das Bild wird nur bei der Erzeugung der Szene geladen und in eine Instanzvariable der SceneryComponent gespeichert, damit es beim neu zeichnen nicht jedes Mal neu geladen wird.

Nun funktioniert das ganze (und auch stabil). Wenn ich ein Objekt ansehe (also mit rechtsklick drauf klicke) startet nun der Thread für die Textausgabe. Dadurch wird das Bild neu gezeichnet, sodass es jedes mal, wenn ich auf ein Objekt klicke, flackert. Obwohl das Bild ja nicht neu geladen wird, sondern lediglich neu gezeichnet. Das neu-zeichnen ist ja in diesem Fall sogar überflüssig, weil am Bild ja nichts geändert wird.

Stimmt etwas grob an meiner Programmstruktur nicht oder muss ich nur genauer festlegen, wann Bilder neu gezeichnet werden sollen?

lg Toto
 

Network

Top Contributor
Um solchen Problemen komplett aus dem Weg zu gehen - sodass man sich darüber überhaupt keine Gedanken mehr machen muss - ist die Doppelpufferung.

Bei kleineren Java Programmen funktioniert diese Methode sehr gut. Und es fallen viel Programmtext weg.

Deine Variante, nur ein paar Objekte neu zu laden, wird Exponentiell, bei größer werdenden Spielumgebung, unübersichtlicher und stellt damit auf lange Zeit keine Lösung oder Alternative dar.
 

JUserToto

Aktives Mitglied
Hallo,

erstmal danke für die Antwort. War schon kurz davor meinen Thread wieder zu löschen, weil ich dachte meine Beschreibung versteht eh niemand. Ist ja ohne Code immer nicht einfach.
Das mit dem DoubleBuffering hab ich nun öfters gelesen und es klingt für mich durchaus logisch.
Ich habe allerdings ein Problem mit der Implementierung...

Derzeit sieht die Struktur ja so aus:

JFrame (Hauptfenster) -> JPanel (Panel der das eigentliche Spiel zeigt) -> JComponents mit Bildern für die einzelnen Szenerieobjekte.

Ich habe also eben versucht eine Doppelpufferung ein zu programmieren...

ich schreibe also in paintComponent (vom JPanel):
Java:
    public void paintComponent(Graphics g) {
        if (buffImg == null || buffImg.getWidth() != getWidth()
                || buffImg.getHeight() != getHeight()) {
            buffImg = gfxConf.createCompatibleImage( getWidth(), getHeight() );
            paintImg(buffImg.createGraphics());
        }

        g.drawImage(buffImg,0, 0, this);
    }

und zeichne in der Methode paintImg(Graphics g) das Hintergrundbild (mit g.drawImage).
Nun müsste ich die Bilder der Szenerieobjekte malen. Das sind ja aber erstmal keine Bilder, sondern Komponenten, auf denen Bilder gemalt werden...
Ich kann es also nicht einfach so machen:

Java:
  public void paintImg(Graphics g) {
        // Hintergrundbild
        g.drawImage(sceneImage, 0, 0, this);
        
       // Einzelne Szenerieobjekte werden erzeugt.
        if (sceneryImages != null && !sceneryImages.isEmpty()) {

            Iterator szenerieIterator = sceneryImages.keySet().iterator();

            Position currentPos;
            SceneryComponent2D currentPanel;

            while (szenerieIterator.hasNext()) {
                currentPanel = (SceneryComponent2D) szenerieIterator.next();
                currentPanel.setOpaque(false);
                currentPos = (Position) sceneryImages.get(currentPanel);
                this.add(currentPanel);
                currentPanel.setBounds(currentPos.x, currentPos.y
                        ,currentPanel.gibImage().getWidth(null)
                        ,currentPanel.gibImage().getHeight(null));
                currentPanel.getGraphics().drawImage(currentPanel.gibImage(), 0, 0, this);

            }
        }
    }

Zur Erklärung: sceneryImages enthält alle Szenerieobjekt-Komponenten und deren Positionen in der Szene. Es ist eine HashMap. Der Szenerieobjekt-Komponente ist also eine Position zugeordnet...
Kann ich das so überhaupt mit Doppelpufferung lösen?
 

JUserToto

Aktives Mitglied
Hallo nochmal,

mittlerweile habe ich es hinbekommen.
Mein Fehler war, dass ich die Bilder der Szenerieobjekte auf die Szenerieobjekt-Komponenten gezeichnet habe.
Jetzt habe ich die Bilder direkt über das Hintergrundbild gemalt (mit Doppelpufferung) und darüber eine Unsichtbare Komponente gelegt, damit sie auch anklickbar sind.
Jetzt blinkt garnichts mehr und ich bin voll zufrieden.
Was ich etwas schade find ist, dass manchmal der MouseListener beim ersten Klick nicht reagiert. Kann man da etwas gegen tun
 

TX

Mitglied
Wenn es so geht, dann ist gut, obwohl mir diese Szenerieobjekte jetzt nichts sagen.
Hättest aber vielleicht auch einfach einen Mouselistener verwenden können, der alle Elemente durchgeht und checkt, ob und welches angeklickt wurde.

z.B. so, (ist nur ein grober Entwurf)

Java:
public class Schluessel{

	private Rectangle clickableField;
	
	public setClickableField(int x, int y, int w, int h){
		clickableField = new Rectangle(x, y, w, h);
	}
	
	public boolean isClicked(int x, int y){
		return clickableField.contains(x, y);
	}

}

public class MouseL extends MouseAdapter{
	
	private Schluessel schluessel;
	
	public void mouseReleased(MouseEvent e) {
		if(schluessel.isClicked(e.getX(), e.getY());
		
	}
	
}
 

JUserToto

Aktives Mitglied
Mit Szenerieobjekte meine ich einfach alle Objekte in einer Adventure Szene, die man ansehen oder nehmen oder benutzen kann. Weiß nicht, wie ich sie sonst nennen soll.

Im Moment funktioniert alles ohne Flackern und ohne Probleme. Deswegen: Never change a running System :D
Dein Vorschlag hilft mir vielleicht noch bei einem anderen Problem.
Da ich nun alles implementiert hab, was ich ich geplant hatte, möchte ich mich nun der Spielfigur widmen...
Überlege noch, ob ich lieber ein Pfadsystem benutzen soll, oder Dijkstra o.Ä. implementieren soll...
Sollte ich mich wirklich für die Wegfindung entscheiden, muss ich ja einen bestimmten Bereich des Bildes freigeben... dabei könnte mir dein Vorschlag helfen.

Der Thread hier ist aber erstmal erledigt. Danke nochmal :)
 

Network

Top Contributor
Hallo nochmal,

mittlerweile habe ich es hinbekommen.
Mein Fehler war, dass ich die Bilder der Szenerieobjekte auf die Szenerieobjekt-Komponenten gezeichnet habe.
Jetzt habe ich die Bilder direkt über das Hintergrundbild gemalt (mit Doppelpufferung) und darüber eine Unsichtbare Komponente gelegt, damit sie auch anklickbar sind.

Schön :)

In Swing braucht man Double Buffering eigentlich nicht selbst zu machen, das ist da schon eingebaut...

Seit wann denn das?
Also ich meine, die Frageperson hat es implementiert und es funktioniert nun besser denn vorher. Also ist es scheins doch nicht bereits eingebaut. Versteh mich nicht falsch. Mich interessiert gerade nur die Aussage daran. Man lernt nie aus ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
T Transparente Bilder mit Graphics zeichnen Java Basics - Anfänger-Themen 17
M Bilder laden und zeichnen Java Basics - Anfänger-Themen 3
B Bilder zeichnen Java Basics - Anfänger-Themen 2
J Verzeichnis auslesen und festgelegte Anzahl Bilder zeichnen Java Basics - Anfänger-Themen 4
S Bilder gleich am Start zeichnen. Java Basics - Anfänger-Themen 15
T 2 Bilder übereinander zeichnen? Java Basics - Anfänger-Themen 5
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
S Bilder in .jar Datei laden Java Basics - Anfänger-Themen 10
S Bilder zoomen Java Basics - Anfänger-Themen 0
S Kann keine Bilder laden? Java Basics - Anfänger-Themen 9
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
B Auslesen von PDF / Bilder Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
L Verschiedene Bilder per Knopfdruck anzeigen lassen Java Basics - Anfänger-Themen 17
M Bilder in .Jar exportieren Java Basics - Anfänger-Themen 2
T Bilder in ausführbarer Jar Java Basics - Anfänger-Themen 11
F 2 wechselnde Bilder Java Basics - Anfänger-Themen 4
D Verzögerung des Erscheinens der Bilder Java Basics - Anfänger-Themen 5
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
F Bilder aus jar einlesen Java Basics - Anfänger-Themen 10
J Bilder in Labels aktualisieren Java Basics - Anfänger-Themen 2
T jpeg Bilder zoomen.. Java Basics - Anfänger-Themen 2
C Bilder von Festplatte in Programm hochladen Java Basics - Anfänger-Themen 6
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
C Threads Threaded Bilder bearbeiten Java Basics - Anfänger-Themen 8
K Bilder mit Eclipse exportieren Java Basics - Anfänger-Themen 1
J Slideshow zeigt bilder nicht an Java Basics - Anfänger-Themen 3
R Bilder aus Array als anklickbare Objekte Java Basics - Anfänger-Themen 3
K Export nach Jar mit Bilder Java Basics - Anfänger-Themen 2
L Wie bette ich Bilder in eine .jar ein? Java Basics - Anfänger-Themen 4
C Pfad für Bilder angeben Java Basics - Anfänger-Themen 11
B Bilder laden und drauf zugreifen[Eclipse] Java Basics - Anfänger-Themen 9
E ImageJ mehrere Bilder hintereinander bearteiten Java Basics - Anfänger-Themen 2
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
H Bilder ohne Verlust speichern Java Basics - Anfänger-Themen 2
J Ladebalken anzeigen während Bilder geladen werden Java Basics - Anfänger-Themen 2
R Bilder positionieren Java Basics - Anfänger-Themen 5
D Erstellte Jar datei zeigt keine Bilder an Java Basics - Anfänger-Themen 5
4 4kb bilder Java Basics - Anfänger-Themen 5
Q Pfadangabe für zu speichernde Bilder Java Basics - Anfänger-Themen 2
B Bilder speichern (jpg, gif, jpg) Java Basics - Anfänger-Themen 4
S Bilder einladen Java Basics - Anfänger-Themen 26
B Aus einem Eclipse Projekt eine .jar - keine Bilder drin Java Basics - Anfänger-Themen 7
H Bilder im GUI einfügen Java Basics - Anfänger-Themen 12
G Bilder in Jar anzeigen lassen Java Basics - Anfänger-Themen 23
T Bilder in der jar-datei Java Basics - Anfänger-Themen 10
H Zahlen Bilder zuordnen möglich? Java Basics - Anfänger-Themen 4
K BufferedImage, Bilder laden Java Basics - Anfänger-Themen 15
J Bilder von Objekten Java Basics - Anfänger-Themen 3
A Bilder in Eclipse speichern Java Basics - Anfänger-Themen 7
J Mit JS, Text und Bilder von Webseite verändern... Java Basics - Anfänger-Themen 10
S Input/Output Text und Bilder laden Java Basics - Anfänger-Themen 5
T Bilder werden in Jar nicht geladen Java Basics - Anfänger-Themen 10
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
T Buttons (auf denen bilder sind) random vertauschen Java Basics - Anfänger-Themen 11
D Bilder Laden, mit Eclipse ok, .jar nicht Java Basics - Anfänger-Themen 5
F Bilder aus .jar datei laden Java Basics - Anfänger-Themen 1
M Applet soll Bilder aus Ordner lesen Java Basics - Anfänger-Themen 9
F Bilder enfügen und Bewegen Java Basics - Anfänger-Themen 6
I Drehbare bilder in 3D Java Basics - Anfänger-Themen 4
T JTextPane - setText kein kein neuladen der Bilder? Java Basics - Anfänger-Themen 8
A Bilder in Eclipse Java Basics - Anfänger-Themen 8
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
N Bilder Objekten zuweisen Java Basics - Anfänger-Themen 2
N jar kann Bilder nicht finden(?) Java Basics - Anfänger-Themen 4
S Spiel automat -Bilder vergleichen Java Basics - Anfänger-Themen 3
R Gif Bilder flimmern Java Basics - Anfänger-Themen 10
P Signiertes JAR aber keine Bilder o0 Java Basics - Anfänger-Themen 6
S Bilder der Diashow werden in anderen Bildern angezeigt Java Basics - Anfänger-Themen 3
G Bilder aus dem Projekt Verzeichnis werden n. angezeigt Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
K Bilder "langsam" laden Java Basics - Anfänger-Themen 4
FreddyStepp Bilder zusammenfügen Java Basics - Anfänger-Themen 7
B GUI-Bilder einfügen Java Basics - Anfänger-Themen 40
S Bilder vergleichen Java Basics - Anfänger-Themen 6
B Kann man im Thread Bilder laden? Java Basics - Anfänger-Themen 8
S Wo speichere ich Bilder für Applets (Netbeans) Java Basics - Anfänger-Themen 5
J Mehrere Bilder laden Java Basics - Anfänger-Themen 6
D Bilder einfügen Java Basics - Anfänger-Themen 8
W Bilder einfügen? Java Basics - Anfänger-Themen 2
S Mehrere Bilder bewegen Java Basics - Anfänger-Themen 5
D Bilder in JFrame laden Java Basics - Anfänger-Themen 8
L Frage bzgl. Threads beim Bilder laden Java Basics - Anfänger-Themen 3
S Bilder in AWT Java Basics - Anfänger-Themen 7
J java applets bilder? Java Basics - Anfänger-Themen 11
manunana89 Bilder auf JFrame/beste Möglichkeit??? Java Basics - Anfänger-Themen 5
K Bilder werden nicht angeziegt !!! Java Basics - Anfänger-Themen 2
max56 Bilder ausgeben Java Basics - Anfänger-Themen 21
K Bilder/Dateien aus package einlesen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben