Schlieren beim DoubleBuffering mit Java

Jan-Michael

Jan-Michael

Aktives Mitglied
Thread Starter
Dabei seit
28.02.2005
Beiträge
397
Reaktionspunkte
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);
    }
}
 
Zurück
Oben Unten