# Tips für ein kleines Pong-Applet



## Jhonny (13. Feb 2010)

Hallo Leute,

könnte sich jemand bitte mein Code anschauen und mir Tipps für das abprallen des Balles vom Schläger geben. Rect hat eine methode die überprüft ob eine berührung mit einem anderen objekt vorliegt aber ich weiß leider net wie ich dies in meinem code umsetzten kann.
Für eure hilfe wär ich sehr dankbar.


```
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;



		

public class BallApplet extends Applet implements Runnable , KeyListener {
	
	int x_pos = 30;
	int y_pos = 100;
	int radius = 20;
	int x_speed = 10;
	int y_speed = 10;
	int y_rechteck = 200;
	int x_rechteck = 10;
	int appletsize_x = 500;
	int appletsize_y = 500;
    private Graphics dbg;
    private Image dbImage;
    Object ball;
    Object paddel;
	
	public void init(){
		this.setSize(appletsize_x,appletsize_y);
		setBackground(Color.blue);
		addKeyListener(this);
		
	}
	
	public void start(){
		// Schaffen eines neuen Threads, in dem das Spiel läuft
		Thread th = new Thread (this);
		// Starten des Threads
		th.start ();
	}
	
	public void stop(){
		
	}
	
	public void destroy(){
		
	}
	@Override
	public void run() {
		// Erniedrigen der ThreadPriority
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

		// Solange true ist läuft der Thread weiter
		while (true)
		{

			
//			if(x_pos >appletsize_x+radius){					// X Wand! Bedingungen für Beamen
//				x_pos = -20;
//			}else if(x_pos <= -radius){
//				x_pos = appletsize_x+radius;
//			}
//			  x_pos += x_speed;
//			  
//			if(y_pos >appletsize_y+radius-100){					// Y Wand! Bedingungen für Beamen
//				y_pos = -20;
//			}else if(y_pos <= -radius){
//				y_pos = appletsize_y+radius;
//			}
//			  y_pos += y_speed;
			
			if(x_pos >appletsize_x-radius){					// X Wand! Bedingung für Abprallen
				x_speed = -10;
			}else if(x_pos <= radius){
				x_speed = +10;
			}
			 x_pos += x_speed;
			
			if(y_pos >appletsize_y-radius){					// Y Wand! Bedingung für Abprallen
				y_speed = -10;
			}else if(y_pos <= radius){
				y_speed = +10;
			}
			  y_pos += y_speed;
			  
			  /////////////////////////////// Abprallen vom dingsdabumsda
			  
			  
			
			  
			 
		      // Neuzeichnen des Applets
		      repaint();
		      
		      try
		      {
		            // Stoppen des Threads für in Klammern angegebene Millisekunden
		            Thread.sleep (20);
		      }
		      catch (InterruptedException ex)
		      {
		            // do nothing
		      }

		      // Zurücksetzen der ThreadPriority auf Maximalwert
		      Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

		} 
	}
	
	public void paint(Graphics g){
		g.setColor(Color.red);
		g.fillOval(x_pos-radius, y_pos-radius, 2*radius, 2*radius);
		g.fillRect(x_rechteck, y_rechteck, 15, 100);
		
	}
	
	

	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);

	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode()== KeyEvent.VK_SPACE){
			if(x_speed == -1){
				x_speed = 1;
			}else if(x_speed==1){
				x_speed = -1;
			}
		}
		if(e.getKeyCode()== KeyEvent.VK_UP){
			y_rechteck= y_rechteck-10;
			}
		if(e.getKeyCode()== KeyEvent.VK_DOWN){
			y_rechteck= y_rechteck+10;
		}
		if(e.getKeyCode()== KeyEvent.VK_LEFT){
			x_rechteck= x_rechteck-10;
		}
		if(e.getKeyCode()== KeyEvent.VK_RIGHT){
			x_rechteck= x_rechteck+10;
		}
	}
	
		
	

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
```

Mit freundlichen Grüßen
Jhonny


----------



## Steev (13. Feb 2010)

Das erinnert mich an folgende Threads:

http://www.java-forum.org/spiele-multimedia-programmierung/95926-tischtennis-spiel.html
http://www.java-forum.org/spiele-multimedia-programmierung/96089-applet-startet-fuehrt-thread.html

Da steht eigendlich schon der nötige Code drin.

Viel Spaß damit ;-)


----------



## OliverKroll (13. Feb 2010)

Das Programm ist an sich vollständig, aber es hat den Focus noch nicht. Das führt dazu, daß der Ball sich zwar bewegt, aber die Tastatur nicht reagiert. Wenn man auf das Applet drückt, dann reagiert die Tastatur und man kann dein Spiel spielen.
Damit das Applet von Anfang an spielbar ist, kannst du in Zeile 53 einfügen:

```
this.requestFocusInWindow();
```
Damit kann man das Spiel von Anfang an spielen, ohne erst auf das Applet drücken zu müssen.

Ist schon spät , ich merk' jetzt erst, daß man den Ball noch gar nicht treffen kann. Alles Wichtige steht bei Steev.


----------



## Jhonny (14. Feb 2010)

Hab mir die codes angeschaut und bin blick es immer noch nicht :autsch:
das ist ja nur eine abfrage die ich machen müßte ... also ob das rechteck den kreis berührt. und das frage ich mit contains soweit ich weiß...
aber ich weiß nicht sorecht wo genau ich das schreiben soll . hab ja nicht extra eine klasse für das rechteckt gemacht...........


----------



## Steev (14. Feb 2010)

Normalerweise solltest du den Ball, den Spieler usw. in Extraklassen auslagern. Wenn du das erstmal gemacht hast, dann brauchst du bei der Klasse spielert nur noch eine Methode hitBall(Ball ball) oder so machen und kannst dann einfach abfragen, ob der Spieler den Ball berührt um dann entsprechend zu reagieren.
Beim Abprallen wird in der Regel bei PingPong noch die Y-Geschwindigkeit des Balles entsprechend der Aufprallposition neu berechnet. Den Code hatte ich aber bei einem der beiden Themen schon gepostet.
Guck dir vieleicht einfach mal den Code von Quaxli an, da steht eigendlich alles drin, was du machen musst. Die Abfrage, ob der Ball den Spieler berührt musst du direkt nach der Positionsveränderung des Balles schreiben, damit du direkt reagieren kannst. Die X-Geschwindigkeit wird dann einfach nur invertiert und die Y-Geschwindigkeit entsprechend folgendem Codes neu initialisiert:

[Java]    x_speed = -x_speed;
    // Y-Position muss zwischen player.y_pos und player.y_pos + player.height liegen
    double yp = y_pos - player.y_pos + (player.height / 2.);
    double pw = 100 * yp / (player.height / 2.);
    y_speed = pw * max_y_speed;[/Java]

Falls du Probleme damit hast, die Klassen zu erstellen kannst du dich ja nochmal melden.

Gruß
Steev


----------

