Schlieren beim DoubleBuffering mit Java

  1. Jan-Michael

    Jan-Michael Thread StarterMacUser Mitglied

    Mitglied seit:
    28.02.2005
    Beiträge:
    391
    Zustimmungen:
    0
    Hallo Leute,

    ich habe mich gerade mal aufgemacht, um einen kleinen Pong-Clone in Java zu erstellen. Als ich jedoch DoubleBuffering implementiert habe zeichnet Java mehrere Linien per Zufall nach, die den Sinn und Effekt von DoubleBuffering eher schmähler. Deshalb hier meine Frage: Liegt das an mir bzw. an meinem Code oder doch an der Java-Plattform? Welche möglichen Lösungen gibt es für das Problem?

    Für eure Bemühungen und euer Interesse an meinem kleinen Problem schon mal besten Dank im Vorraus. Den Quelltext hab ich nachfolgend einfach angeführt. -> Übrigens: Ich verwende die Java 5.0-Plattform

    Code:
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class Bpong extends JApplet implements Runnable, KeyListener, MouseListener {
    	
    	Thread myThread;
    	Image buffer;
    	Graphics bufferGraphics;
    	int x=100, ball_x=50, ball_y=50, ball2_x=120, ball2_y=10, geschwindigkeit=90, dx=2, dy=2, d2x=2, d2y=1;
    	double zaehler=0;
    	
        public void init() {
            // set the default look and feel
            String laf = UIManager.getSystemLookAndFeelClassName();
            try {
                UIManager.setLookAndFeel(laf);
            } catch (UnsupportedLookAndFeelException exc) {
                System.err.println ("Warning: UnsupportedLookAndFeel: " + laf);
            } catch (Exception exc) {
                System.err.println ("Error loading " + laf + ": " + exc);
            }
                getContentPane().setLayout (null);
    			this.setBackground(Color.white);
    			buffer = this.createImage(this.size().width, this.size().height);
    			bufferGraphics = buffer.getGraphics();
    			this.addKeyListener(this);
    			this.addMouseListener(this);
    			myThread = new Thread(this);
        }
    	
    	public void keyPressed(KeyEvent e) {
    		switch(e.getKeyCode()) {
    			case KeyEvent.VK_LEFT: x-=4;  break;
    			case KeyEvent.VK_RIGHT: x+=4; break;
    		}
    	}
    	
    	public void keyReleased(KeyEvent e) {}
    	public void keyTyped(KeyEvent e) {}
    	
    	public void mousePressed(MouseEvent e) {
    		myThread.start();
    	}
    	
    	public void mouseReleased(MouseEvent e) { ; }
    	public void mouseClicked(MouseEvent e) { ; }
    	public void mouseEntered(MouseEvent e) { ; }
    	public void mouseExited(MouseEvent e) { ; }
    	
    	public void run() {
    		while(true) {
    			regeln();
    			repaint(ball_x-dx, ball_y-dy, 10, 10);
    			repaint(ball_x, ball_y, 10, 10);
    			repaint(ball2_x-d2x, ball2_y-d2y, 10, 10);
    			repaint(ball2_x, ball2_y, 10, 10);
    			repaint(x-4, 130, x+40-4, 130);
    			repaint(x, 130, x+40, 130);
    			zaehler++;
    			try {
    				myThread.sleep(45);
    			} catch(InterruptedException in_ex) {}
    		}
    	}
    	
    	public void stop() {}
    	
    	public void regeln() {
    		if(ball_x==0 || ball_x==140) dx=-dx;
    		if(ball_y==0 || (ball_y==120 && ball_x>(x-5) && ball_x<(x+35))) dy=-dy;
    		if(ball_y>120) { System.out.println("Du hast verloren"); myThread.stop(); }
    
    		if(ball2_x==0 || ball2_x==140) d2x=-d2x;
    		if(ball2_y==0 || (ball2_y==120 && ball2_x>(x-5) && ball2_x<(x+35))) d2y=-d2y;
    		if(ball2_y>120) { System.out.println("Du hast verloren"); myThread.stop(); }
    		
    		ball2_x+=d2x; ball2_y+=d2y;
    		ball_x+=dx; ball_y+=dy;
    		
    		//if(zaehler%300==2 && geschwindigkeit>=40) { geschwindigkeit-=10; System.out.println(geschwindigkeit); }
    		if(zaehler==9200) { System.out.println("Du hast gewonnen!"); myThread.stop();  }
    	}
    	
    	public void update(Graphics g) { paint(g); }
    
        public void paint (Graphics g) {
            super.paint(g);
    		bufferGraphics.setColor(this.getBackground());
    		bufferGraphics.fillRect(0, 0, this.size().width, this.size().height);
            bufferGraphics.setColor(Color.black);
    		bufferGraphics.drawOval(ball_x, ball_y, 10, 10);
    		bufferGraphics.drawOval(ball2_x, ball2_y, 10, 10);
    		bufferGraphics.setColor(Color.red);
    		bufferGraphics.drawLine(x, 130, x+40, 130);
    
    		g.drawImage(buffer, 0, 0, this);
        }
    }
    
     
    Jan-Michael, 15.12.2005
Die Seite wird geladen...
Ähnliche Themen - Schlieren beim DoubleBuffering
  1. Massaguana
    Antworten:
    12
    Aufrufe:
    711
    Massaguana
    02.12.2016
  2. Scherak
    Antworten:
    5
    Aufrufe:
    549
    Scherak
    31.12.2015
  3. SpecialFighter
    Antworten:
    0
    Aufrufe:
    305
    SpecialFighter
    15.09.2015
  4. Maverick258
    Antworten:
    1
    Aufrufe:
    357
    Maverick258
    29.08.2015