performance

Status
Nicht offen für weitere Antworten.

tt

Mitglied
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?
 

Marco13

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

tt

Mitglied
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:


Code:
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();
	    		 }
	    	 }
	    		
		}


Code:
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;
        }
	}

Code:
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

Top Contributor
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.
 

trazzag

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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.
 
G

Guest

Gast
der ball springt vom spieler balken immer im gleichen winkel weg!!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K VideoPlayer: Xuggler seekkeyframe extrem schlechte Performance.. Spiele- und Multimedia-Programmierung 3
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
turing OpenGL / Jogle Code Reveiw zur Performance Verbesserung Spiele- und Multimedia-Programmierung 1
F Massive FPS-Schwankungen, schlechte Performance Spiele- und Multimedia-Programmierung 3
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
K Android: OpenGL render performance Tipps ? Spiele- und Multimedia-Programmierung 4
B Performance Spiele- und Multimedia-Programmierung 19
Grejak Performance Spiele- und Multimedia-Programmierung 5
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
M Performance von BufferedImages Spiele- und Multimedia-Programmierung 15
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
A jogl 2d performance Spiele- und Multimedia-Programmierung 20
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
S Graphics2D Oval vs. Rect -Performance Spiele- und Multimedia-Programmierung 17
Taschenschieber Schachbrett mit SVG/Batik: Performance? Spiele- und Multimedia-Programmierung 3
Tapsi Anfänger braucht einen Rat ^^ --> Performance Spiele- und Multimedia-Programmierung 7
egrath Vista OpenGL Performance Problem? Spiele- und Multimedia-Programmierung 3
I RPG-Spiel und Performance Spiele- und Multimedia-Programmierung 33
N Performance Problem bei mit Graphics Spiele- und Multimedia-Programmierung 6
M Spiel Performance erhöhen Spiele- und Multimedia-Programmierung 24
M Performance Spiele- und Multimedia-Programmierung 5
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19
M Space PingPong Game --> Performance ok? Spiele- und Multimedia-Programmierung 44
J Performance Spiele- und Multimedia-Programmierung 6
P Java3D Performance und Abstürze Spiele- und Multimedia-Programmierung 3
K Performance von J3D Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen


Oben