1. Wir werden um 10:30 Uhr die Forum Software auf die neue Version aktualiseren. Das Forum wird für ca. eine halbe Stunde geschlossen bleiben.

    Vielen Dank
    Macuser.de Community! Team

Schlieren beim DoubleBuffering mit Java

Dieses Thema im Forum "Mac OS X Entwickler, Programmierer" wurde erstellt von Jan-Michael, 15.12.2005.

  1. Jan-Michael

    Jan-Michael Thread Starter MacUser Mitglied

    Beiträge:
    391
    Zustimmungen:
    0
    MacUser seit:
    28.02.2005
    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);
        }
    }
    
     
Die Seite wird geladen...

Diese Seite empfehlen