Doppelte Pufferung und 2DLandschaft



  • Hi Leute,

    ich hab ein kleines Problem.
    Ich hab mir ein kleines Applet geschrieben welches mir eine 2D Landschaft generiert. Jetzt wollte ich noch eine Kugel über die Landschaft laufen lassen. Dies hat soweit auch geklappt, nur hab ich jetzt ein Problem wenn ich da eine doppelte Pufferung reinmachen will, um das bekannte Flimmern zu vermeiden.

    Wenn ichs ohne Pufferung mach, dann hab ich das flimmern drin, der Code dazu sieht dann so aus:

    import java.awt.*;
    import java.applet.Applet;
    
    public class LandschaftApplet extends Applet implements Runnable
    {
        private int i;    
        private int richtung;
        private int hoehe;    
        private Thread th1;
        private int xpos;
        private int zaehler;
        private int[] feld = new int[401];
    
        public void init()
        {        
            hoehe = 200;
            richtung = 1;
            xpos = 0;
            zaehler = 0;
        }
    
        public void start()
        {
            th1 = new Thread(this);
            th1.start();
        }
    
        public void stop()
        {
           th1.stop(); 
        }
    
        public void run()
        {
            while(true)
            {
                try
                {
                    th1.sleep(100);
                    repaint();
                }
                catch(InterruptedException e)
                {                
                }
            }
        }
    
        public void paint(Graphics g)
        {
            if(zaehler == 0)
            {
                for(i=0;i<400;i++)
                {
                    g.setColor(Color.green);
                    g.drawLine(i,400,i,hoehe);
                    hoehe += richtung;
                    if(Math.round(Math.random()*10)>= 9) richtung *= -1;
                    feld[i] = hoehe;
                }
                zaehler++;
            }
            else
            {
                for(i=0;i<400;i++)
                {
                    g.setColor(Color.green);
                    g.drawLine(i,400,i,feld[i]);               
                }
                g.setColor(Color.blue);
                g.fillOval((xpos-25),(feld[xpos]-55),50,50);
                xpos++;
                if(xpos >= 401) System.exit(0);
            }        
        }     
    }
    

    wenn ich es mit doppelter Pufferung mache, dann flimmert zwar nichts mehr, aber wenn ihr das Applet mal ein bisschen laufen lasst, seht ihr das die Kugel dann hinter einer weißen Fläche verschwindet. Dies ist ohne doppelte Pufferung ned so. Der Code dazu sieht so aus:

    import java.awt.*;
    import java.applet.Applet;
    
    public class LandschaftApplet extends Applet implements Runnable
    {
        private int i;    
        private int richtung;
        private int hoehe;
        private Image dbImage;
        private Graphics dbg;
        private Thread th1;
        private int xpos;
        private int zaehler;
        private int[] feld = new int[401];
    
        public void init()
        {        
            hoehe = 200;
            richtung = 1;
            xpos = 0;
            zaehler = 0;
        }
    
        public void start()
        {
            th1 = new Thread(this);
            th1.start();
        }
    
        public void stop()
        {
           th1.stop(); 
        }
    
        public void run()
        {
            while(true)
            {
                try
                {
                    th1.sleep(100);
                    repaint();
                }
                catch(InterruptedException e)
                {                
                }
            }
        }
    
        public void paint(Graphics g)
        {
            if(zaehler == 0)
            {
                for(i=0;i<400;i++)
                {
                    g.setColor(Color.green);
                    g.drawLine(i,400,i,hoehe);
                    hoehe += richtung;
                    if(Math.round(Math.random()*10)>= 9) richtung *= -1;
                    feld[i] = hoehe;
                }
                zaehler++;
            }
            else
            {
                for(i=0;i<400;i++)
                {
                    g.setColor(Color.green);
                    g.drawLine(i,400,i,feld[i]);               
                }
                g.setColor(Color.blue);
                g.fillOval((xpos-25),(feld[xpos]-55),50,50);
                xpos++;
                if(xpos >= 401) System.exit(0);
            }        
        }
    
        public void update(Graphics g)
        {        
            if(dbImage == null)
            {
                dbImage = createImage(this.getSize().width, this.getSize().height);
                dbg = dbImage.getGraphics();
            }
            dbg.setColor(getBackground());
            dbg.fillRect(0,0,this.getSize().width,this.getSize().height);
            dbg.setColor (getForeground());
            paint (dbg);
            g.drawImage (dbImage, 0, 0, this);
        } 
    }
    

    Kann mir da jemand weiterhelfen???
    gibts noch andere Möglichkeiten um das Flimmern zu vermeiden?

    Danke im voraus für eure Mühen

    Gruß Zeke



  • Ich habe jetzt nichts ausprobiert von deinem Code oder so...

    Du läst ja das ganze Bild neu zeichen. Warum lässt du nicht nur die Veränderung neu zeichen??

    Ich weiß jetzt nicht genau wie aber wenn man das in der MFC machen kann dann geht das mit Sicherheit auch in Java.

    Vielleicht hilft dir das weiter.


Anmelden zum Antworten