# Flimmern abstellen



## Zefir (13. Okt 2009)

Hallo erstmal.

Mein Problem :
Ich habe ein einfaches Spiel programmiert, bestehend aus 1 Gui und 8 Klassen für die Objekte.
In diesem Spiel kommen Gebäude vor, welche im Verlauf des Spieles kommt es sehr schnell zu einem Flimmern.
Wie kann ich dieses Flimmern unterbinden und wenn es eine spezielle Klasse gibt, wo genau muss diese angebracht werden?


----------



## The_S (13. Okt 2009)

Kommt drauf an wie du zeichnest. Evtl. löst DoubleBuffering dein Problem.


----------



## Marco13 (13. Okt 2009)

Wenn du Swing verwendest, sollte ein eigenes DoubleBuffering aber nicht nötig sein. *rumrat* Rufst du irgendwo "getGraphics" auf?


----------



## Zefir (13. Okt 2009)

```
public void paint (Graphics g ){
    	 

    	 q.draw(g, i, h);i=i+3;
    	 if(i==921)i=0;
         b.draw(g, x, y); 
         
        u.draw(g, c , x, y, k4);
        u1.draw(g,c1 , x, y);
        u2.draw(g,c2 , x, y);
        u3.draw(g,c3 , x, y);
        u4.draw(g,c4 , x, y);
        if(haus2){g.setColor(Color.white);
        	g.fillRect(400, 300, 100, k2*30);}
        
        if(haus3){g.setColor(Color.white);
        g.fillRect(550, 200, 50, k3*40);}
        if(haus4){g.setColor(Color.white);
        g.fillRect(750, 380, 70, 20+k4*20); 
        g.setColor(Color.blue);
        g.fillOval(740,385+k4*20,20,20);
   	 g.setColor(Color.white);
	 g.fillOval(735,380+k4*20,20,20);}
        
        if(haus5){g.setColor(Color.white);
        g.fillRect(300, 200, 50, k5*40);}
        if(haus1){g.setColor(Color.white);
        g.fillRect(100, 400, 33, k1*20);}
         if (v){ //Bombe werfen
        	 ü.draw(g, i, a);        	 
        	 a=a+12;
        	 try {
                 Robot robot = new Robot();
                      Color col = robot.getPixelColor(910-i-1, h+a+70);
                      if(col.getBlue()!= 255 & col.getRed()!=255 & col.getGreen()!= 255){
                    	  g.setColor(c);
                    	  g.fillOval(890-i, 90+a, 40, 40);
                    	  v=false;a=0;
                     if (i<=200){  int rot=r.nextInt(255);//CopyofGebäude
               		   int grün=r.nextInt(255);
               		   int blau=r.nextInt(255);
               		   c= new Color(rot,grün,blau);haus4=true;k4=k4+1;}
                     if (400>=i & i>=300){  int rot1=r.nextInt(255);//CopyofGebäude1
             		   int grün1=r.nextInt(255);
             		   int blau1=r.nextInt(255);
             		   c2= new Color(rot1,grün1,blau1);haus3=true;k3=k3+1;
             		   }
                     if (550>=i & i>=400){  int rot2=r.nextInt(255);//CopyofGebäude3
           		   		int grün2=r.nextInt(255);
           		   		int blau2=r.nextInt(255);
           		   		c3= new Color(rot2,grün2,blau2);haus2=true;k2=k2+1;}
                     if (640>=i & i>=550){  int rot3=r.nextInt(255);//CopyofGebäude2
                     	int grün3=r.nextInt(255);
                     	int blau3=r.nextInt(255);
                     	c1= new Color(rot3,grün3,blau3);haus5=true;k5=k5+1;}
                     if (850>=i & i>=730){  int rot4=r.nextInt(255);//CopyofGebäude4
                     	int grün4=r.nextInt(255);
                     	int blau4=r.nextInt(255);
                     	c4= new Color(rot4,grün4,blau4);haus1=true;k1=k1+1;if(k1==10){k1=0;}
                      }}}
                    	  catch (AWTException e) {
                          e.printStackTrace();
                      }
         }
      
         if(a>470) {a=0; v=false;}
          
     }
```


----------



## The_S (13. Okt 2009)

Ein bisschen mehr Infos wären schön ...


----------



## Unregistriert (13. Okt 2009)

Eh ja sry ich versteh eure frage nicht so ganz das ist jetzt mal der Aufruf der einzelnen Bilder bzw der Grapphics g.
Wenn du mir genau sagst was du brauchst kann ich das auch reinstellen.


----------



## The_S (13. Okt 2009)

Wir haben auch keine Frage gestellt. Einfach nur die Anmerkung: Du solltest DoubleBuffern. Auf welcher Komponente zeichnest du denn?


----------



## Zefir (13. Okt 2009)

Ich zeichne auf nene Frame falls das hilft und hab bisher keinen Buffer drinn.
Bräuchte einen Quellcode für nen Buffer oder so.


----------



## The_S (13. Okt 2009)

Einfach anstelle auf Graphics in deiner paint-Methode auf ein BufferedImage zeichnen und am Ende dann das Bild via Graphics zeichnen.


----------



## Marco13 (13. Okt 2009)

Dass man eigentlich nicht in der paint-Methode eines Frames zeichnen sollte, und das mit Swing (JFrame) sowieso besser wäre, werfe ich jetzt mal noch so ein....


----------



## Zefir (13. Okt 2009)

Das klingt gut leider bin ich nicht so bewandert darin, darum meine Frage wie mache ich das?


----------



## The_S (13. Okt 2009)

Marco13 hat gesagt.:


> Dass man eigentlich nicht in der paint-Methode eines Frames zeichnen sollte, und das mit Swing (JFrame) sowieso besser wäre, werfe ich jetzt mal noch so ein....



Einen Schritt nach dem Anderen, sonst wird das noch zu verwirrend  . Aber hast natürlich recht!


----------



## The_S (13. Okt 2009)

Zefir hat gesagt.:


> Das klingt gut leider bin ich nicht so bewandert darin, darum meine Frage wie mache ich das?



Einfach mal nach Double Buffering googeln, da finden sich genügend Beispiele.


----------



## Zefir (13. Okt 2009)

Vielen Dank hab auch gleich etwas gefunden.


```
Double Buffering - Java @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe[/url]
Damit funktioniert es einwandfrei.
```


----------



## L-ectron-X (13. Okt 2009)

:meld: Es gibt auch genügend Beispiel-Material in diesem Forum.


----------



## André Uhres (14. Okt 2009)

Zefir hat gesagt.:


> Bräuchte einen Quellcode für nen Buffer


Folgendes Beispiel enthält die Klasse "PanelDoubleBuffered", welche die Doppelpufferung besorgt und die wir einfach nur erweitern müssen, wann immer wir Doppelpufferung in AWT benötigen: AwtDoubleBuffered - Byte-Welt Wiki


----------



## Developer_X (20. Okt 2009)

das geht alles viel einfacher.
Mach mal dieses hier:

```
import javax.swing.*;
import java.awt.*;

public class Game extends JFrame
{
  public Game()
  {
    setSize(200,200);
    setLocation(20,20);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());

    JPanel p = new JPanel()
    {
        @Override
        public void paintComponent(Graphics g)
        {
        //zeichne hier deinen ganzen kram
        }
    };

    add(p,"Center");

    setVisible(true);
  }
  public static void main(String[]args)
  {
     new Game();
  }
}
```


----------

