# performance



## tt (9. Nov 2008)

hi,

habe mir ein ping pong spiel (applet) geschrieben. das applet läuft im safari browser flüssig im mozilla browser leider nicht. kann mir jemand einen tipp geben, woran es liegen könnte?


----------



## Soulfly (9. Nov 2008)

Aktuellste JRE? Auch auf beiden Browsern?


----------



## tt (9. Nov 2008)

hm, habe das applet mit dem applet tag eingebunden. jetzt habe ich es noch mal mit dem object tag versucht bzw. wie es auf der sun site beschrieben wird 

java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/using_tags.html
leider erfolglos.


----------



## Marco13 (9. Nov 2008)

Es liegt entweder daran, dass der Rechner zu langsam ist (was hier wohl ausgeschlossen werden kann), oder es liegt ... an deinem Programm.....


----------



## tt (9. Nov 2008)

ok,

dann poste ich mal meinen versuch, vielleicht / mit sicherheit gibt es da noch verbesserungsmöglichkeiten. zur zeit ist es noch schwer zu gewinnen. naja, wie gesagt mein erster versuch:



```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends Applet implements Runnable{
	
	//Variable für die Spielgeschwindigkeit
	private int speed = 10;
	private int hit;
	
	//Instanzvariablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;
	
	//Spiel-Thread
	private Thread th;
	
	// Deklaration der Objektreferenzen bzw. Spielfiguren
	private Schlaeger Schlaeger1;
	private Schlaeger Schlaeger2;
	private Ball SpielBall;
	private Score Punkte;
	
	//Test
	public boolean test = false;
	public boolean test1 = false;

	//Initialisieren des Applets
	public void init(){
		//Hintergrundfarbe setzen
		setBackground(Color.darkGray);
		
		//Speilobjekte erzeugen
		Schlaeger1 = new Schlaeger(10, 100, 7, 70);
		Schlaeger2 = new Schlaeger(663, 120, 7, 70);
		SpielBall = new Ball(30, 205, 7, 7, 2, 2);
		Punkte = new Score(0);
		
		//Damit auf KeyCodes gehört wird
		addKeyListener(new Key());
		
		//Damit auf MouseEreignisse gehört wird
		addMouseMotionListener(new Mouse());
			}

	public void start(){
		//Schaffen eines neuen Threads, in dem das Spiel läuft
		th = new Thread(this);
		//Starten des Threads
		th.start();
	}
	
	public void stop(){
		//Thread stoppen
		th.stop();
		//Thread auf Null setzten
		th = null;
	}
	
	public void destroy(){}
	
	public void run(){
		
		//Erniedrigen der ThreadPriority
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
		
		//Solange true ist läuft der Thread weiter
		while(true){
			
			//Hier werden die jweiligen Methoden aufgerufen
			if(test == true){
				SpielBall.move();
			//Falls der Ball im rechten Aus landet wird dem Computer ein Punkt gutgeschrieben und die BallGeschwindigkeit zurueckgesetzt
			if(SpielBall.xPos >= 680){
				hit = 0;
				speed = 10;
				Punkte.score();
				SpielBall = new Ball(30, 205, 7, 7, 2, 2);
				SpielBall.move();
				//Wenn der Computer vier Punkte hat, wird das Spiel gestoppt
				if(Punkte.score > 3){
					SpielBall.gameOver1();
					Schlaeger1 = new Schlaeger(10, 100, 7, 70);
					test = false;
					}
				}
			}
			steuerung();
			hit();
			hit1();
			speed();
			SpielBall.gameOver();
			
		
		//neuzeichnen des Applets
		repaint();

			try{			
				//Stoppen des Threads für in Klammern angegebene Millisekunden
				Thread.sleep(speed);
			}
			catch(InterruptedException e){
				//do nothing
				}
			//Zurücksetzten der ThreadPriority auf Maximalwert
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
				}
			}

	public void update(Graphics g){
		// Initialisierung des DoubleBuffers
		if (dbImage == null){
		dbImage = createImage (this.getSize().width, this.getSize().height);
		dbg = dbImage.getGraphics();
		}
		// Bildschirm im Hintergrund löschen
		dbg.setColor(getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);
		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
			}
	
	//Hier wird gezeichnet
	public void paint(Graphics g){
		//Hier werden die Spielobjekte gezeichnet
		Schlaeger1.drawSchlaeger(g);
		Schlaeger2.drawSchlaeger(g);
		SpielBall.drawBall(g);
		g.setFont(new Font("Arial", Font.BOLD, 24));

		g.drawString(""+Punkte.score, 185, 30); 
		g.drawString("0", 470, 30);
		g.drawLine(0, 40, 680, 40);
		g.drawLine(340, 40, 340, 480);
		g.setColor(Color.blue); 
		
		if(test == false){
			g.setColor(Color.darkGray); 
			g.fillOval(140, 125, 400, 150);
			g.setColor(Color.orange); 
			g.drawOval(140, 125, 400, 150);
			g.drawString("Spielstart: F6 drücken!", 207, 200);
				}
		
		}
	
			//Hier wird der linke Schlaeger gesteuert
			public void steuerung(){
				if(SpielBall.xPos <= (getSize().width/2) && SpielBall.yPos < Schlaeger1.yPos+30){
					Schlaeger1.up();
							}
				else if(SpielBall.yPos >= Schlaeger1.yPos){
					Schlaeger1.yPos = SpielBall.yPos-30;
						}
				if(Schlaeger1.yPos <= 40)Schlaeger1.min();
				
				if(SpielBall.xPos <= (getSize().width/2) && SpielBall.yPos > Schlaeger1.yPos){
					Schlaeger1.down();
							}
				else if(SpielBall.yPos >= Schlaeger1.yPos){
					Schlaeger1.yPos = SpielBall.yPos;
						}
				if(Schlaeger1.yPos >= 410)Schlaeger1.max();
	
			}
			
			//Hier wird geguckt, ob der Ball vom rechten Schlaeger getroffen wurde und nicht ueber die Spielbegrenzung hinaus geht
			public void hit(){
				if(SpielBall.xPos >= 656 && SpielBall.yPos >= Schlaeger2.yPos-5 && SpielBall.yPos <= Schlaeger2.yPos+70){
							SpielBall.yZufall();
							SpielBall.xRichtung();
							hit++;
								}
							}
			
			//Hier wird geguckt, ob der Ball vom linken Schlaeger getroffen wurde
			public void hit1(){
				if(SpielBall.xPos <= 17 && SpielBall.yPos >= Schlaeger1.yPos-5 && SpielBall.yPos <= Schlaeger1.yPos+70){
					SpielBall.xRichtung();
				}
			}
			
			//Hier wird die Spielgeschwindigkeit erhoeht
			public void speed(){
				if(hit >= 2)speed = 7;
				if(hit >= 6)speed = 4;
			}
			
			//Hier werden Punkte für den Computer vergeben
			public void scoreRight(){
				if(SpielBall.xPos >= 675){
					Punkte.score();
						}
				if(Punkte.score > 4)Punkte.score = 0;
					}
			
			//Hier eine anonyme Klasse, die auf KeyEreignisse reagiert
	    	class Key extends KeyAdapter{
				
	    		public void keyPressed(KeyEvent e){
	    			
	    				int key = e.getKeyCode();
	        			if(key == KeyEvent.VK_F6){
	        				test = true;
	        				hit = 0;
	        				speed = 10;
	        				scoreRight();
	        				Punkte.score = 0;
	        				Schlaeger1 = new Schlaeger(10, 100, 7, 70);
	        				Schlaeger2 = new Schlaeger(663, 120, 7, 70);
	        				SpielBall = new Ball(30, 205, 7, 7, 2, 2);
	    						}
	    					}
	    				}
	    	//Hier eine anonyme Klasse für MouseEreignisse
	    	 class Mouse extends MouseMotionAdapter{
	    		 public void mouseMoved(MouseEvent e){
	    			 int y = e.getY();
	    			 Schlaeger2.yPos = y;
	    			 if(Schlaeger2.yPos <= 40)Schlaeger2.min();
	    			 if(Schlaeger2.yPos >= 410)Schlaeger2.max();
	    		 }
	    	 }
	    		
		}
```



```
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

class Schlaeger {
	
	//Damit ZufallsZahlen erzeugt werden
	Random r = new Random();
	
	//Instanzvariablen für die Spielfiguren 
	protected int xPos;				//X-Position
	protected int yPos;				//Y-Position
    protected int xLaenge;        	//Ausmasse in X Richtung 
    protected int yLaenge;        	//Ausmasse in y Richtung 
        
    
    protected double y;
        //Konstruktor 
        public Schlaeger(int x, int y, int xAusdehnung, int yAusdehnung){ 
                this.xPos = x; 
                this.yPos = y; 
                this.xLaenge = xAusdehnung; 
                this.yLaenge = yAusdehnung; 
                        } 
        
        //Hier wird der linke Schlaeger gezeichnet
        public void drawSchlaeger(Graphics g){ 
                g.setColor(Color.orange); 
                g.fillRect(xPos, yPos, xLaenge, yLaenge); 
        			} 
        
        //Damnit der linke Schlaeger nach oben und unten bewegt werden kann
        public void up(){
        	yPos -=2;
        		}
        
        public void down(){
        	yPos +=2;
        		}

        //Damit der linke Schlaeger nicht ueber die Spielflaeche hinaus geht
        public void min(){
        	yPos = 40;
        }
        public void max(){
        	yPos=410;
        }
	}
```


```
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

class Ball extends Schlaeger{
	
	//Damit ZufallsZahlen erzeugt werden
	Random r = new Random();

	//Instanzvariablen
	protected int xSpeed;
	protected int ySpeed;
	
	//Test
	protected boolean test;
	
	//Konstruktor
	public Ball(int x, int y, int xAusdehnung, int yAusdehnung, int xGes, int yGes) {
		
		super(x, y, xAusdehnung, yAusdehnung);
		
		this.xSpeed = xGes;
		this.ySpeed = yGes;
	}
	        	
       //Hier wird der Ball gezeichnet 	
        	  public void drawBall(Graphics g){ 
                  g.setColor(Color.orange); 
                  g.fillRect(xPos, yPos, xLaenge, yLaenge); 
        	  			}
        	  
        	    //Hier wird der Ball in Bewegung gesetzt 
        	    public void move(){ 
        	    	
        	    	if(test == false){ 
        	            xPos += xSpeed; 
        	            if(xPos >= 654){ 
        	            	test = true;
        	            }
        	    	}
        	            
        	    	if(test == true){ 
        	    		
        	    		xPos += xSpeed; 
        	    		yPos += ySpeed; 
        	            
        	            if (xPos >= 680){ 
        	                   xSpeed--; 
        	                    }
        	            else if(xPos < 0){ 
        	                    xSpeed++; 
        	                    }
        	            if (yPos >= 473){ 
        	                    ySpeed--; 
        	                    }
        	            else if(yPos <= 40){ 
        	                    ySpeed++; 
        	                    }
        	    	}
        	            
        	            }  
        	    
        	    //Hier wird die Richtung des Balls geaendert, falls er vom rechten Schlaeger getroffen wurde
        	    public void yZufall(){
        	    	ySpeed = (1 + Math.abs(r.nextInt())%2)*-1;
        	    		}

        	    public void xRichtung(){
        	    	xSpeed *= -1;
        	    }
        	    
        	    //Hier wird geguckt, ob der Ball im Aus ist
        	    public void gameOver(){
        	    	if(xPos >= 680){
        	    		xSpeed = 0; ySpeed = 0;
        	    	}
        	    }
        	    public void gameOver1(){
        	    	
        	    		xSpeed = 0; ySpeed = 0;
        	    	
        	    }
        	    
        	    //Hier wird die Geschwindigkeit erhoeht
        	    public void speed(){
        	    	xSpeed = 3;
        	    	ySpeed = 3;
        	    }

		}[quote][/quote]
```


----------



## Quaxli (9. Nov 2008)

Ein Link wo wir testen könnten wäre ganz nett gewesen....

Dein Programm läuft bei mir (Firefox 3.01) relativ flüssig. Der Ball bewegt sich manchmal etwas ruckelig (aber das liegt daran, daß Du ihn über einen Fixwert bewegst) und die Kollisionen stimmen noch nicht 100%. Aber insgesamt ist das Ganze spielbar.

Ich hatte das Spiel im Übrigen ganz banal über die Applet-Tags eingebunden.


----------



## tt (9. Nov 2008)

stimmt, das mit dem link habe ich vergessen sorry . komisch ist nur das es bei mir in firefox nicht wirklich läuft, also schleppend.  
tim.matti-johannsen.de


----------



## trazzag (11. Nov 2008)

Bei mir (MacBook Pro mit Firefox 3.0.3) hakt das Applet auch gewaltig -> nicht spielbar. Kann dir nach kurzem durchsehen deines Codes leider nicht weiterhelfen, woran das liegt.


----------



## Apo (11. Nov 2008)

Bei mir mit Firefox 3.03 läuft es recht flüssig. Erst wenn der Ball sehr schnell ist, dann laggt es doch schonmal.
Weswegen genau kann ich auch nicht so richtig sehen.


----------



## Evil-Devil (12. Nov 2008)

Läuft bei mir im aktuellen Firefox auch recht flüssig. Einzig die Spieler/Maus Bewegung hakt hier und da, wenn der Ball schnell unterwegs ist.


----------



## Guest (14. Nov 2008)

der ball springt vom spieler balken immer im gleichen winkel weg!!!


----------

