2D-Grafik Paint - Wie binde ich repaint ein?

Kayuke

Mitglied
Guten Tag, ich habe ein Menü und möchte dort jetzt ein Spiel einbinden wenn man auf Singleplayer klickt. Das ist die Klasse die derzeit erscheint wenn ich auf "Singleplayer" klicke:

Java:
package GruppeD;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;


//Vorbereitetes Panel für den Aufbau der Spieloberfläche für Singleplayer-Modus
class SinglePlayerPanel extends JPanel implements ActionListener {
   private MainPanel mainPanel;
   private int bgX = 0;
   private int bgY = 0;
   Timer time;
   
   // Hintergrund
   Image backgroundImage;
   
   public SinglePlayerPanel(MainPanel mainPanel) {
      this.mainPanel = mainPanel;
          
      // Bilder laden
      loadImages();
      
     // Timer (Wenn die beiden Zeilen auskommentiert sind, funktionierts.)
     // time = new Timer(10,this);
     // time.start();
   }
   
   //Sämtliche Bilder für das Spiel laden
   private void loadImages() {
      try {
        backgroundImage = ImageIO.read(getClass().getResource("/GruppeD/images/Game/background.png"));
      }
      catch(IllegalArgumentException iae) {
         JOptionPane.showMessageDialog(this, "Eine Grafikdatei wurde nicht gefunden!", "IllegalArgumentException", JOptionPane.ERROR_MESSAGE);
         System.err.println(iae.toString()); //Ausgabe für den Entwickler auf der Konsole
      }
      catch(IOException ioe) {
         JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!", "IOException", JOptionPane.ERROR_MESSAGE);
         System.err.println(ioe.toString()); //Ausgabe für den Entwickler auf der Konsole
      }
   }  
   
   // Zeichnen
   @Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);
       
       // Hintergrund zeichnen
       g.drawImage(backgroundImage, bgX, 0, this);
       
       // Hintergrund nachzeichnen (Sidescroll-Effekt)
       if (bgX < 0)
           g.drawImage(backgroundImage, getWidth()+bgX, 0, this);
       
       // Hintergrund verschieben
       if (bgX < -getWidth()) {
           bgX = 0;
       }
       else {
           bgX--;
       }  
       
       // Muss weg, ich weiß, aber wohin?
       repaint();
   }
   
   public void actionPerformed(ActionEvent e) {
      mainPanel.showMenuPanel();
   }
}

Nun die Frage, derzeit zeichnet er nur neu wenn ich in Paint am Ende Repaint schreibe, was halt Sinn ergibt aber eine Endlosschleife erzeugt was nicht gesund ist :p Ich habe versucht repaint in eine neue Methode zu schreiben, aber diese muss ja iwie immer wieder aufgerufen werden, wie krieg ich das genau hin?
 
J

JohannisderKaeufer

Gast
repaint() kann man aufrufen, wenn sich etwas ändert.

Ein Beispiel mit einem String.
Java:
class MyClass extends JPanel{
  private String value;

  public void paintComponent(Graphics g){
    super(g);
    ((Graphics2D)g).drawString(value);
  }

  public void setValue(String v){
    this.value = v;
    //Hier würde ich die logik zum Neuzeichnen unterbringen.
    validate();
    repaint();
  }

}

Das ganze kann auch über das Observer Pattern geschehen indem das JPanel Observer implementiert und Value ein Observable ist.
 

Kayuke

Mitglied
Hmm es ist so, ich habe vorher ein Helikopter Spiel direkt programmiert mit Paint und brauchte kein repaint aber da war ein Timer. Dort konnte ich den Delay einstellen und dann wurde z.B. alle 10 Millisekunden neugezeichnet.

Jetzt möchte ich dasselbe in dem Code haben wo ich bisher nur das Menü habe und möchte dort jetzt das Spiel komplett neu eincoden. Er soll also quasi alle 10 Millisekunden repaint machen, das muss doch so iwie machbar sein?

Weil später fliegen da auch Gegner etc. und ich will nicht bei jeder Aktion am Ende repaint schreiben.
 

Marco13

Top Contributor
Da du ja vermutlich irgendeinen Game Loop hast, würde es sich anbieten, da das repaint reinzuschreiben
Java:
while (gameRunning)
{
    doLogic(); // Bewegt die Gegner etc...
    panel.repaint();
    Thread.sleep(someMS);
}
 

Kayuke

Mitglied
Klappt wieder mal garnix :/

Meine Prognose: Er führt paint erst nachher aus und kommt sofort in die While Schleife mit repaint. Außerdem kommts mir so vor als ob der gesamte Code von der "SinglePlayerPanel.java" schon bei Programmstart ausgeführt wird und nicht erst wenn ich auf SinglePlayer im Menü klicke. Dies glaube ich deshalb weil wenn ich bei der Methode loadImages in dem SinglePlayerPanel eine falsche Url angebe so kommt sofort eine Fehlermeldung und nicht erst wenn ich auf Singleplayer klicke.

Würde mich sehr freuen um Hilfe, weiß nicht was ich noch versuchen soll.

Also hier der Code:

Java:
package GruppeD;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;


//Vorbereitetes Panel für den Aufbau der Spieloberfläche für Singleplayer-Modus
class SinglePlayerPanel extends JPanel implements ActionListener {
   private MainPanel mainPanel;
   private int bgX = 0;
   private int bgY = 0;
   Timer time;
   boolean running;
   
   // Hintergrund
   Image backgroundImage;
   
   public SinglePlayerPanel(MainPanel mainPanel) {
      this.mainPanel = mainPanel;
          
      // Bilder laden
      loadImages();
      
      // Game running
      running = true;
      game();

   }
   
   //Sämtliche Bilder für das Spiel laden
   private void loadImages() {
      try {
        backgroundImage = ImageIO.read(getClass().getResource("/GruppeD/images/Game/background.png"));
      }
      catch(IllegalArgumentException iae) {
         JOptionPane.showMessageDialog(this, "Eine Grafikdatei wurde nicht gefunden!", "IllegalArgumentException", JOptionPane.ERROR_MESSAGE);
         System.err.println(iae.toString()); //Ausgabe für den Entwickler auf der Konsole
      }
      catch(IOException ioe) {
         JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!", "IOException", JOptionPane.ERROR_MESSAGE);
         System.err.println(ioe.toString()); //Ausgabe für den Entwickler auf der Konsole
      }
   }  
   
   
   private void game(){
	   while (running)
	   {
		   // Neuzeichnen
		   repaint();
		   
		   // Sleep
		   try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	   }
   }
   // Zeichnen
   @Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);
       
       // Hintergrund zeichnen
       g.drawImage(backgroundImage, bgX, 0, this);
       
       // Hintergrund nachzeichnen (Sidescroll-Effekt)
       if (bgX < 0)
           g.drawImage(backgroundImage, getWidth()+bgX, 0, this);
       
       // Hintergrund verschieben
       if (bgX < -getWidth()) {
           bgX = 0;
       }
       else {
           bgX--;
       }  
       
   }
   
   public void actionPerformed(ActionEvent e) {
      mainPanel.showMenuPanel();
   }
}
 

xehpuk

Top Contributor
[JAVA=22] public SinglePlayerPanel(MainPanel mainPanel) {
this.mainPanel = mainPanel;

// Bilder laden
loadImages();

// Game running
running = true;
game(); // YIKES!!!

}[/code]
Dadurch landet man beim Aufruf von
Code:
new SinglePlayerPanel(...)
in der Schleife. Das hat da nichts zu suchen. Die Methode muss nach der Erstellung des Panels von einem separaten Thread (bloß nicht dem EDT) aufgerufen werden.
Wobei die Methode gar nicht zum Panel gehören sollte, genauso wenig wie die Information, dass das Spiel gerade läuft.
 
V

vanny

Gast
Ich halte es generell für eine schlechte Idee, nur den timer als Steurung für die Framerate zu nutzen.
Besser ist es, wie schon mal angeschnitten, jede "sichtbare" aktualisierung neu zu zeichnen.
Was, wenn deine Daten nach 10 millis nur halb fertig berechnet wurden oder du wesentlich mehr FPS rausholen könntest?
 

Kayuke

Mitglied
Hmm wäre sehr dankbar für noch weitere Hilfe:

Da es ein Sidescroller ist und der Hintergrund sich quasi durchgehend neuzeichnet, wollte ich nicht nach jeder Aktion ein repaint, da es durch den Hintergrund sowieso ganze zeit Ausgeführt wird.

Kann nochmal jemand versuchen mir es zu erklären ?

Es steht im obigen Post: die Methode Repaint soll nach dem erstellen des Panels in einem separaten Thread aufgerufen werden, wie genau stelle ich dies an? Ich kriege es nicht hin 2 Threads zu erstellen und es aufrufen zu lassen. Genau wie ich nicht verstehe warum die Methode "repaint" nicht zum Panel gehören soll, ich überschreibe ja schließlich auch da die paint?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
M Probleme mit paint() aus JFrame AWT, Swing, JavaFX & SWT 2
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
G Frage zum paint Prozess AWT, Swing, JavaFX & SWT 3
D JPanel und Paint AWT, Swing, JavaFX & SWT 2
B Gui und Zeichnen (paint ? ) AWT, Swing, JavaFX & SWT 4
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9
B Button anzeigen bei überschrieber paint() AWT, Swing, JavaFX & SWT 12
N paint Methode im JFrame AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben