# ping pong ball abprallen lassen



## Java-Freak (2. Jun 2010)

hallo
ich programmiere gerade ein einfaches ping pong.
jetzt habe ich versuch, bei kollision des balls mit dem panel de ball abprallen zu lassen(wie das ein normaler ball halt so macht)
dazu rufe ich die methode reverse() auf, sobald der ball einen balken berührt
die sieht bisher so aus:

```
void reverse() {
		int vert =  (int) getVerticalSpeed();
		int horiz = (int) getHorizontalSpeed();
		if (vert <= 0 && horiz <= 0) {
			setVerticalSpeed(-horiz);
		}
		if (vert >= 0 && horiz <= 0) {
			setHorizontalSpeed(-horiz);
		}
		if (vert >= 0 && horiz >= 0) {
			setVerticalSpeed(-vert);
		}
		if (vert >= 0 && horiz <= 0) {
			setVerticalSpeed(-vert);
		}
		if (vert <= 0 && horiz >= 0) {
			setHorizontalSpeed(-horiz);
		}
		if (vert >= 0 && horiz >= 0) {
			setHorizontalSpeed(-horiz);
		}
		if (vert <= 0 && horiz >= 0) {
			setVerticalSpeed(-vert);
		}
		
	}
```
ich habe mir die methode so überlegt, das ich jeden möglichen abpraller aufgeschrieben habe(8 stück) und dann jeweils die nötige veränderung dazu geschrieben habe.
dann -> in java implementiert und gemerkt: die einzelnen bedingungen widersprechen sich...
hättet ihr eine idee wie man das einfach lösen könnte, bzw hat das schon mal jemand gemacht?
(gemacht haben das schon ewig viele, allein hier im forum gibts um die 20 themen zu ping pong, aber alle sind entweder mit einem oder zwei schläger, aber nie mit 4...)
im anhang könnt ihrs euch mal anschauen wies bisher aussieht(der ball wird schon noch schöner)
danke!


----------



## Geeeee (2. Jun 2010)

Ich bin nun nicht wirklich ein Spieleentwickler, aber das kommt mir alles sehr komisch vor.
Als Beispiel nehmen wir an, dass dein Ball nach links oben fliegt. Dann würde doch in deinem Code kein Unterschied bestehen, ob er nun das linke Panel oder das obere trifft, oder?
Gib doch das Panel bzw. dessen Orientierung mit in die Funktion, da kannst du dann besser unterscheiden, was passieren soll.
Anmerkung: Evtl. fehlen da auch noch ein paar "elses" vor den "ifs" bzw. manche Bedingungen sind doppelt.


----------



## Java-Freak (2. Jun 2010)

Geeeee hat gesagt.:


> Als Beispiel nehmen wir an, dass dein Ball nach links oben fliegt. Dann würde doch in deinem Code kein Unterschied bestehen, ob er nun das linke Panel oder das obere trifft, oder?


genau das ist das problem





Geeeee hat gesagt.:


> Gib doch das Panel bzw. dessen Orientierung mit in die Funktion, da kannst du dann besser unterscheiden, was passieren soll.


das wäre eine lösung. momentan überprüfe ich die kollision noch in der klasse ball. ich könnte nun aus der einen klasse panel zwei machen, die kollision dann in den 2 verschiedenen klassen überprüfen und bei z.b. kollision mit panelVertikal eine reverseVertikal methode aufrufen und umgekehrt. diese möglichkeit hab ich mir schon gedacht, jedoch wollte ich vorerst noch einmal versuchen den aufwand mit 2 klassen nach möglichkeit zu vermeiden.


----------



## Gast2 (2. Jun 2010)

Probiers vllt mal so:


```
public void checkCollision() {
        if (colidingNorthPanel() || colidingSouthPanel()) {
            setVerticalSpeed(-getVerticalSpeed());
        } 
        if (colidingEastPanel() || colidingWestPanel()) {
            setHorizontalSpeed(-getHorizontalSpeed());
        }
    }
```
Du müsstest dann nur noch die 4 colidingXYPanel() methoden implementieren.


----------



## Java-Freak (2. Jun 2010)

schon mal ne gute idee, aber um die colidingXY() zu implementieren muss ich die einzelnen balken iwi auseinenderhalten können, was nicht, geht, da sie alle einfach nur ein panel sind.
ich gleube ich werde die lösung mit den 2 klassen nehmen, sooooo viel aufwand isses au wieder net


----------



## Geeeee (2. Jun 2010)

Dann leite doch in einer Stufe von JPanel ab und erweitere es um eine Orientation-Variable und eine isCollision(Point punktDesBalls) Funktion.
Dann kannst du alle Panels in jedem "Frame" durchiterieren und nach Kollision abfragen, wenn vorhanden, dann getOrientation auf dem kollidierenden Panel aufrufen und dementsprechend handeln.


----------



## Java-Freak (2. Jun 2010)

nicht von JPanel sondern von meiner klassen Panel
mein programm ist etwas anders aufgebaut:
ich hab eine klasse

```
public abstract class GameObject extends Rectangle2D.Double implements Drawable, Movable {
```
davon leiten sich die klassen ball und früher Panel jetzt PanelVert und PanelHoriz ab.
GameObject schreibt seinen unterklassen also die methoden der beiden interfaces (drawObjects in Drawable und doLogic und move in Movable)plus

```
public abstract boolean collidedWith(GameObject s);
```
 vor
dann gibt es noch eine klasse GameFrame wo alle spiel logik ausgeführt wir und das fenster gebaut wird
in der spielschleife gibt es einen aufruf einer methode, die unter anderem das hier überprüft:

```
for (int i = 0; i < actors.size(); i++) {
			for (int n = i + 1; n < actors.size(); n++) {

				GameObject s1 = actors.get(i);
				GameObject s2 = actors.get(n);

				s1.collidedWith(s2);

			}
		}
```
actors ist eine arrayList mit allen spiel objekten die es gibt. der obige code lässt also alle objecte miteinander kollidieren.
ob sie sich auch wirklich berühren, muss die methode selbel schauen.
hier etwa mal die collidedWidh von PanelVert

```
@Override
	public boolean collidedWith(GameObject s) {
		if (this.intersects(s)) {
			if(s instanceof Ball){((Ball) s).reverseVert();}
			return true;
		}
		return false;
	}
```
also nur wenn die überschneidung einen ball betrifft tue iwas
wenn sich das ganze wirklich nur die 2 GameObjects betreffen würde wäre mein vorgehen unnötig kompliziert.
da icg das ganze jadoch noch um verschiedene andere objecte erweitert haben möchte ist mein code dazu geeignet.


----------



## Geeeee (3. Jun 2010)

Java-Freak hat gesagt.:


> nicht von JPanel sondern von meiner klassen Panel
> mein programm ist etwas anders aufgebaut:


Ok, gibt solche und solche 
Aber an der Stelle [c] if(s instanceof Ball){((Ball) s).reverseVert();}[/c] kommst du, wenn du dann noch mehr Objekte bekommst einfach nicht so gut weiter. Du müsstest dann im Ball jede Art von Kollision durch eine Methode beschreiben. Und wenn noch andere Objekte miteinander kollidieren können, schreibst du einen Haufen an Methoden doppelt und dreifach (falls du es nicht in die GameObject Klasse ziehen kannst)
Das sollte imho in der Klasse Game Frame passieren (Randbremerkung: wobei du evtl. auch noch Grafik und Logik trennen solltest).
Nämlich deine Logik-Klasse weiß bei der Überprüfung ganz genau, was passiert ist, also wer da mit wem Kontakt hatte, und kann dementsprechend reagieren. Stelle ich mir persönlich übersichtlicher vor.
Aber evtl. können da auch die (2D-)Spielespezialisten was zu sagen (ich will dich einfach nur nicht im Regen stehen lassen)


----------



## Java-Freak (3. Jun 2010)

was schreibe ich denn da doppelt?
ich schreibe einfach entweder im ball 
	
	
	
	





```
if(s instanceof PanelVert){this.reverseVert();}
```
 *oder* im PanelVert halt das was ich schon gepostet habe. das wars dann schon. ich definiere an genau einer stelle in meinem programm in einem der beiden "kollisionspartner" was passieren soll wenn eine bestimmte kollision auftritt.ich glaube ich poste einfach mal mein gesammtes programm, dann könnt ihrs euch besser vorstellen. ist aber ziemlich lang:
GameFrame.java

```
package own.game.one;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JPanel implements Runnable, KeyListener {
	private static final long serialVersionUID = 1L;
	boolean game_running = true;
	boolean time_over = false;
	boolean game_over = false;
	boolean game_paused = false;
	boolean started = false;
	boolean once = false;
	javax.swing.Timer timer;
	int game_time = 0;
	private JFrame frame;
	long delta = 0;
	long fps = 0;
	long last = 0;
	boolean up = false;
	boolean down = false;
	boolean left = false;
	boolean right = false;
	int speed = 300;
	PanelHoriz panelhoritzontaloben;
	PanelHoriz panelhoritzontalunten;
	PanelVert panelvertikalrechts;
	PanelVert panelvertikallinks;
	Ball ball;
	ArrayList<GameObject> actors;
	ArrayList<String>highscore;

	public boolean isStarted() {
		return started;
	}

	public void setStarted(boolean started) {
		this.started = started;
		if (!started) {
			timer.stop();
		}
	}

	public void runGame() {
		game_running = true;
	}

	public void stopGame() {
		game_running = false;
	}

	public void alert(String s, Color c, Graphics g) {
		g.setColor(Color.black);
		g.setFont(new Font("Arial", Font.BOLD, 20));
		g.drawRoundRect((frame.getWidth() / 2) - (80 + (s.length() * 10) / 4),
				(frame.getHeight() / 2) - 48, s.length() * 10, 50, 50, 100);
		g.setColor(c);
		g.drawString(s, (frame.getWidth() / 2) - (70 + (s.length() * 10) / 4),
				(frame.getHeight() / 2) - 15);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (!isStarted()) {
			alert("Drücken sie Enter um das Spiel zu Starten", Color.BLACK, g);
		} else {
			if (actors != null) {
				for (Drawable draw : actors) {
					draw.drawObjects(g);
				}
			}
			// g.drawString("FPS: " + Long.toString(fps), 20, 10);
			g.drawString("Zeit: " + getTime(), 0, 10);
			if (game_over) {
				alert("Spiel vorbei!! Ihr Rekord:  " + game_time + " sec",
						Color.red, g);
			}
			if (game_paused) {
				alert("   Pause   ", Color.green, g);
			}
		}
	}

	public static void main(String[] args) {
		new GameFrame(500, 500);
	}

	public GameFrame(int h, int w) {
		frame = new JFrame("Spiel");
		this.setPreferredSize(new Dimension(w, h));
		this.setBackground(Color.white);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.addKeyListener(this);
		frame.pack();
		frame.setVisible(true);
	}

	public void doInits() {
		BufferedImage[] panelhoritzontal = this.loadPics("mypics/panel.gif", 1);
		BufferedImage[] panelvertikal = this.loadPics(
				"mypics/panelvertikal.gif", 1);
		BufferedImage[] ballpicture = this.loadPics("mypics/ball.gif", 1);
		last = System.nanoTime();
		panelhoritzontaloben = new PanelHoriz(panelhoritzontal, 200, 0, 0, this);
		panelhoritzontalunten = new PanelHoriz(panelhoritzontal, 200, frame
				.getHeight(), 0, this);
		panelvertikalrechts = new PanelVert(panelvertikal, 0, 100, 0, this);
		panelvertikallinks = new PanelVert(panelvertikal, frame.getWidth(),
				100, 0, this);
		ball = new Ball(ballpicture, frame.getHeight() / 2,
				frame.getHeight() / 2, 0, this);
		actors = new ArrayList<GameObject>();
		actors.add(panelhoritzontaloben);
		actors.add(panelhoritzontalunten);
		actors.add(panelvertikallinks);
		actors.add(panelvertikalrechts);
		actors.add(ball);
		ball.start();
		game_over = false;
		time_over = false;
		startTimerThread();
		if (!once) {
			once = true;
			Thread t = new Thread(this);
			t.start();
		}
	}

	private void checkKeys() {

		if (up) {
			panelvertikallinks.setVerticalSpeed(-speed);
			panelvertikalrechts.setVerticalSpeed(-speed);
		}
		if (down) {
			panelvertikallinks.setVerticalSpeed(speed);
			panelvertikalrechts.setVerticalSpeed(speed);
		}

		if (right) {
			panelhoritzontaloben.setHorizontalSpeed(speed);
			panelhoritzontalunten.setHorizontalSpeed(speed);
		}

		if (left) {
			panelhoritzontaloben.setHorizontalSpeed(-speed);
			panelhoritzontalunten.setHorizontalSpeed(-speed);
		}
		if (!up && !down) {
			panelvertikallinks.setVerticalSpeed(0);
			panelvertikalrechts.setVerticalSpeed(0);
		}

		if (!left && !right) {
			panelhoritzontaloben.setHorizontalSpeed(0);
			panelhoritzontalunten.setHorizontalSpeed(0);
		}
	}

	void doLogic() {

		Vector<GameObject> trash = new Vector<GameObject>();
		for (Movable mov : actors) {
			mov.doLogic(delta);
			GameObject check = (GameObject) mov;
			if (check.remove) {
				trash.add(check);
			}
		}
		for (int i = 0; i < actors.size(); i++) {
			for (int n = i + 1; n < actors.size(); n++) {

				GameObject s1 = actors.get(i);
				GameObject s2 = actors.get(n);

				s1.collidedWith(s2);

			}
		}
		if (trash.size() > 0) {
			for (GameObject s : trash) {
				actors.remove(s);
			}
		}
		if (ball.ball_away) {
			game_over = true;
		}
		if (time_over) {
			game_over = true;
		}
		if (game_over) {
			
			ball.stop();
			timer.stop();
		}
	}

	private BufferedImage[] loadPics(String path, int pics) {

		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;

		URL pic_url = getClass().getClassLoader().getResource(path);

		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
		}

		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0,
					source.getWidth() / pics, source.getHeight());
		}

		return anim;
	}

	private void calculateDelta() {
		delta = System.nanoTime() - last;
		last = System.nanoTime();

		fps = ((long) 1e9) / delta;
	}

	void moveObjects() {
		for (Movable mov : actors) {
			mov.move(delta);
		}
	}

	public int getTime() {
		return game_time;
	}

	public void startTimerThread() {
		game_time = 0;
		timer = new javax.swing.Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// if (!(game_time == 0)) {
				if (!game_paused) {
					if (!game_over) {
						game_time++;
					}
				}
				/*
				 * } else { time_over = true; }
				 */
			}
		});
		timer.start();
	}

	@Override
	public void run() {
		while (game_running) {
			if (isStarted()) {
				if (!game_paused) {
					checkKeys();
					doLogic();
					moveObjects();
				}
			}
			calculateDelta();
			repaint();
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			up = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = true;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			up = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = false;
		}
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			if (!isStarted()) {
				doInits();
				setStarted(true);
			}
			if (isStarted()) {
				if (!game_over) {
					if (!game_paused) {
						game_paused = true;
						ball.stopAndSave();
					} else if (game_paused) {
						game_paused = false;
						ball.goOn();
					}
				}
			}
		}
		if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
			if (isStarted()) {
				setStarted(false);
				timer.stop();
			} else {
				stopGame();
				System.exit(0);
			}
		}// collidedWith(

	}

	@Override
	public void keyTyped(KeyEvent e) {
	}
}
```
GameObject.java

```
package own.game.one;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JPanel implements Runnable, KeyListener {
	private static final long serialVersionUID = 1L;
	boolean game_running = true;
	boolean time_over = false;
	boolean game_over = false;
	boolean game_paused = false;
	boolean started = false;
	boolean once = false;
	javax.swing.Timer timer;
	int game_time = 0;
	private JFrame frame;
	long delta = 0;
	long fps = 0;
	long last = 0;
	boolean up = false;
	boolean down = false;
	boolean left = false;
	boolean right = false;
	int speed = 300;
	PanelHoriz panelhoritzontaloben;
	PanelHoriz panelhoritzontalunten;
	PanelVert panelvertikalrechts;
	PanelVert panelvertikallinks;
	Ball ball;
	ArrayList<GameObject> actors;
	ArrayList<String>highscore;

	public boolean isStarted() {
		return started;
	}

	public void setStarted(boolean started) {
		this.started = started;
		if (!started) {
			timer.stop();
		}
	}

	public void runGame() {
		game_running = true;
	}

	public void stopGame() {
		game_running = false;
	}

	public void alert(String s, Color c, Graphics g) {
		g.setColor(Color.black);
		g.setFont(new Font("Arial", Font.BOLD, 20));
		g.drawRoundRect((frame.getWidth() / 2) - (80 + (s.length() * 10) / 4),
				(frame.getHeight() / 2) - 48, s.length() * 10, 50, 50, 100);
		g.setColor(c);
		g.drawString(s, (frame.getWidth() / 2) - (70 + (s.length() * 10) / 4),
				(frame.getHeight() / 2) - 15);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (!isStarted()) {
			alert("Drücken sie Enter um das Spiel zu Starten", Color.BLACK, g);
		} else {
			if (actors != null) {
				for (Drawable draw : actors) {
					draw.drawObjects(g);
				}
			}
			// g.drawString("FPS: " + Long.toString(fps), 20, 10);
			g.drawString("Zeit: " + getTime(), 0, 10);
			if (game_over) {
				alert("Spiel vorbei!! Ihr Rekord:  " + game_time + " sec",
						Color.red, g);
			}
			if (game_paused) {
				alert("   Pause   ", Color.green, g);
			}
		}
	}

	public static void main(String[] args) {
		new GameFrame(500, 500);
	}

	public GameFrame(int h, int w) {
		frame = new JFrame("Spiel");
		this.setPreferredSize(new Dimension(w, h));
		this.setBackground(Color.white);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.addKeyListener(this);
		frame.pack();
		frame.setVisible(true);
	}

	public void doInits() {
		BufferedImage[] panelhoritzontal = this.loadPics("mypics/panel.gif", 1);
		BufferedImage[] panelvertikal = this.loadPics(
				"mypics/panelvertikal.gif", 1);
		BufferedImage[] ballpicture = this.loadPics("mypics/ball.gif", 1);
		last = System.nanoTime();
		panelhoritzontaloben = new PanelHoriz(panelhoritzontal, 200, 0, 0, this);
		panelhoritzontalunten = new PanelHoriz(panelhoritzontal, 200, frame
				.getHeight(), 0, this);
		panelvertikalrechts = new PanelVert(panelvertikal, 0, 100, 0, this);
		panelvertikallinks = new PanelVert(panelvertikal, frame.getWidth(),
				100, 0, this);
		ball = new Ball(ballpicture, frame.getHeight() / 2,
				frame.getHeight() / 2, 0, this);
		actors = new ArrayList<GameObject>();
		actors.add(panelhoritzontaloben);
		actors.add(panelhoritzontalunten);
		actors.add(panelvertikallinks);
		actors.add(panelvertikalrechts);
		actors.add(ball);
		ball.start();
		game_over = false;
		time_over = false;
		startTimerThread();
		if (!once) {
			once = true;
			Thread t = new Thread(this);
			t.start();
		}
	}

	private void checkKeys() {

		if (up) {
			panelvertikallinks.setVerticalSpeed(-speed);
			panelvertikalrechts.setVerticalSpeed(-speed);
		}
		if (down) {
			panelvertikallinks.setVerticalSpeed(speed);
			panelvertikalrechts.setVerticalSpeed(speed);
		}

		if (right) {
			panelhoritzontaloben.setHorizontalSpeed(speed);
			panelhoritzontalunten.setHorizontalSpeed(speed);
		}

		if (left) {
			panelhoritzontaloben.setHorizontalSpeed(-speed);
			panelhoritzontalunten.setHorizontalSpeed(-speed);
		}
		if (!up && !down) {
			panelvertikallinks.setVerticalSpeed(0);
			panelvertikalrechts.setVerticalSpeed(0);
		}

		if (!left && !right) {
			panelhoritzontaloben.setHorizontalSpeed(0);
			panelhoritzontalunten.setHorizontalSpeed(0);
		}
	}

	void doLogic() {

		Vector<GameObject> trash = new Vector<GameObject>();
		for (Movable mov : actors) {
			mov.doLogic(delta);
			GameObject check = (GameObject) mov;
			if (check.remove) {
				trash.add(check);
			}
		}
		for (int i = 0; i < actors.size(); i++) {
			for (int n = i + 1; n < actors.size(); n++) {

				GameObject s1 = actors.get(i);
				GameObject s2 = actors.get(n);

				s1.collidedWith(s2);

			}
		}
		if (trash.size() > 0) {
			for (GameObject s : trash) {
				actors.remove(s);
			}
		}
		if (ball.ball_away) {
			game_over = true;
		}
		if (time_over) {
			game_over = true;
		}
		if (game_over) {
			
			ball.stop();
			timer.stop();
		}
	}

	private BufferedImage[] loadPics(String path, int pics) {

		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;

		URL pic_url = getClass().getClassLoader().getResource(path);

		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
		}

		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0,
					source.getWidth() / pics, source.getHeight());
		}

		return anim;
	}

	private void calculateDelta() {
		delta = System.nanoTime() - last;
		last = System.nanoTime();

		fps = ((long) 1e9) / delta;
	}

	void moveObjects() {
		for (Movable mov : actors) {
			mov.move(delta);
		}
	}

	public int getTime() {
		return game_time;
	}

	public void startTimerThread() {
		game_time = 0;
		timer = new javax.swing.Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// if (!(game_time == 0)) {
				if (!game_paused) {
					if (!game_over) {
						game_time++;
					}
				}
				/*
				 * } else { time_over = true; }
				 */
			}
		});
		timer.start();
	}

	@Override
	public void run() {
		while (game_running) {
			if (isStarted()) {
				if (!game_paused) {
					checkKeys();
					doLogic();
					moveObjects();
				}
			}
			calculateDelta();
			repaint();
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			up = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = true;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = true;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			up = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = false;
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = false;
		}
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			if (!isStarted()) {
				doInits();
				setStarted(true);
			}
			if (isStarted()) {
				if (!game_over) {
					if (!game_paused) {
						game_paused = true;
						ball.stopAndSave();
					} else if (game_paused) {
						game_paused = false;
						ball.goOn();
					}
				}
			}
		}
		if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
			if (isStarted()) {
				setStarted(false);
				timer.stop();
			} else {
				stopGame();
				System.exit(0);
			}
		}// collidedWith(

	}

	@Override
	public void keyTyped(KeyEvent e) {
	}
}
```
PanelVert.java

```
package own.game.one;

import java.awt.image.BufferedImage;

public class PanelVert extends GameObject implements Drawable, Movable {
	private static final long serialVersionUID = 1L;

	public PanelVert(BufferedImage[] i, double x, double y, long delay, GameFrame p) {
		super(i, x, y, delay, p);
	}

	@Override
	public void doLogic(long delta) {
		super.doLogic(delta);

		if (getX() < 0) {
			setHorizontalSpeed(0);
			setX(0);
		}

		if (getX() + getWidth() > parent.getWidth()) {
			setX(parent.getWidth() - getWidth());
			setHorizontalSpeed(0);
		}

		if (getY() < 0) {
			setY(0);
			setVerticalSpeed(0);
		}

		if (getY() + getHeight() > parent.getHeight()) {
			setY(parent.getHeight() - getHeight());
			setVerticalSpeed(0);
		}
	}

	@Override
	public boolean collidedWith(GameObject s) {
		if (this.intersects(s)) {
			if(s instanceof Ball){((Ball) s).reverseVert();}
			return true;
		}
		return false;
	}

}
```
PanelHoriz.java

```
//genau so wie PanelVert  nur 
public boolean collidedWith(GameObject s) {
		if (this.intersects(s)) {
			if(s instanceof Ball){((Ball) s).reverseHoriz();}
			return true;
		}
		return false;
	}
```
Ball.java

```
package own.game.one;

import java.awt.image.BufferedImage;

public class Ball extends GameObject implements Drawable, Movable {
	private static final long serialVersionUID = 1L;
	public boolean ball_away;
	int savedVertical = 0;
	int savedHorizontal = 0;

	public Ball(BufferedImage[] i, double x, double y, long delay, GameFrame p) {
		super(i, x, y, delay, p);
	}
	public void stopAndSave(){
		savedHorizontal = (int) getHorizontalSpeed();
		savedVertical = (int) getVerticalSpeed();
		stop();
	}
	public void start() {
		int startspeed= 80;
		if (Math.random() <= 0.6) {
			setHorizontalSpeed(-(random()+startspeed));
		} else {
			setHorizontalSpeed(random()+startspeed);
		}
		if (Math.random() <= 0.6) {
			setVerticalSpeed(-(random()+startspeed));
		} else {
			setVerticalSpeed((random()+startspeed));
		}

	}
	public void goOn(){
		setVerticalSpeed(savedVertical);
		setHorizontalSpeed(savedHorizontal);
	}

	public int random() {
		if (Math.random() <= 0.5) {
			return (int) ((Math.round((Math.random() * 30 - 0.5)) + 1) * -1);
		} else {
			return (int) -((Math.round((Math.random() * 30 - 0.5)) + 1) * -1);
		}
	}
	void reverseHoriz(){
		int vert =  (int) getVerticalSpeed();
		int horiz = (int) getHorizontalSpeed();
		if (vert >= 0 && horiz >= 0) {
			setVerticalSpeed(-(vert+random()));
		}
		if (vert >= 0 && horiz <= 0) {
			setVerticalSpeed(-(vert+random()));
		}
		if (vert <= 0 && horiz >= 0) {
			setVerticalSpeed(-(vert+random()));
		}
		if (vert <= 0 && horiz <= 0) {
			setVerticalSpeed(-(vert+random()));
		}
			
	}
	void reverseVert(){
		int vert =  (int) getVerticalSpeed();
		int horiz = (int) getHorizontalSpeed();
		if (vert <= 0 && horiz <= 0) {
			setHorizontalSpeed(-(horiz+random()));
		}
		if (vert >= 0 && horiz <= 0) {
			setHorizontalSpeed(-(horiz+random()));
		}
		if (vert <= 0 && horiz >= 0) {
			setHorizontalSpeed(-(horiz+random()));
		}
		if (vert >= 0 && horiz >= 0) {
			setHorizontalSpeed(-(horiz+random()));
		}
	}

	void stop() {
		setHorizontalSpeed(0);
		setVerticalSpeed(0);
	}

	@Override
	public void doLogic(long delta) {
		super.doLogic(delta);
		if (getX() < 0) {
			ball_away = true;
			stop();
			setX(0);
		}

		if (getX() + getWidth() > parent.getWidth()) {
			setX(parent.getWidth() - getWidth());
			stop();
			ball_away = true;
		}

		if (getY() < 0) {
			setY(0);
			stop();
			ball_away = true;
		}

		if (getY() + getHeight() > parent.getHeight()) {
			setY(parent.getHeight() - getHeight());
			stop();
			ball_away = true;
		}
	}

	@Override
	public boolean collidedWith(GameObject s) {
		/*if (this.intersects(s)) {
			//reverse();
			return true;

		}*/

		return false;
	}

}
```
Drawable.java

```
package own.game.one;
import java.awt.Graphics;

public interface Drawable {

	public void drawObjects(Graphics g);
	
}
```
Movable.java

```
package own.game.one;

public interface Movable {

	public void doLogic(long delta);
	
	public void move(long delta);
	
}
```
Jetzt schreibe ich gerade an einer klassen Highscore mit der sich der erspielte score zu einer liste in einer datei hinzufügenlässt und die zusätzlich noch methoden zum anzeigen und sortieren enthält


----------



## Geeeee (3. Jun 2010)

Ich bezog mich auf die Aussage:


Java-Freak hat gesagt.:


> da icg das ganze jadoch noch um verschiedene andere objecte erweitert haben möchte


Dann müsstest du in jedem GameObjekt sagen, was zu tun wäre bei einer Kollision. Wenn sich das egal bei welchem Objekt gleich verhält, macht das ja keine Unterschied und wäre unnötig, aber wenn es sich um andere "Kollisionseffekte" handelt, dann muss jedes Element jedes andere kennen und darauf dementsprechend reagieren.
Falls das einzige von der Kollision betroffene Objekt der Ball ist, dann gäbe es evtl. noch die Möglichkeit, dass du bei Kollision in dem jeweiligen Kollisionspartner zum Ball eine getEffect() Methode aufrufst, die z.B. einen 2D-Vektor in Form eines Points zurückgibt und damit bestimmt, was der Ball tun wird.


----------



## Java-Freak (4. Jun 2010)

Geeeee hat gesagt.:


> Falls das einzige von der Kollision betroffene Objekt der Ball ist, dann gäbe es evtl. noch die Möglichkeit, dass du bei Kollision in dem jeweiligen Kollisionspartner zum Ball eine getEffect() Methode aufrufst, die z.B. einen 2D-Vektor in Form eines Points zurückgibt und damit bestimmt, was der Ball tun wird.


ist aber vorraussichlich nicht so 
ich möcht z.b. raketen einbauen, die nicht von den balken berührt werden dürfen


----------



## Antoras (4. Jun 2010)

Was willst du jetzt eigentlich wissen? Wie du eine Methode schreibst, die prüft ob eine Kollision aufgetreten ist, oder wie du feststellst welches Objekt mit welchem kollidiert? Oder was ganz anderes?

Zu den beiden genannten Sachen:

Ich würde da einen eigene Klasse Schläger erstellen, die Koordinaten besitzt, mit der man auf Kollisionen überprüfen kann. Dabei ist es egal ob Schläger viereckig, rund oder sonst was ist, das kannst du durch die Klasse ja genau festlegen.

Danach würde ich eine Liste erstellen, die alle Objekte aufnimmt, mit denen eine Kollision auftreten kann. Dann kannst du die Objekte bequem mit einer Schleife durchgehen und auf Kollisionen überprüfen. Wenn dann eine Kollision auftritt, dann kannst du bequem den Typ des kollidierten Objektes prüfen und dann eine individuelle Aktion auslösen.


----------



## Java-Freak (4. Jun 2010)

Antoras hat gesagt.:


> Was willst du jetzt eigentlich wissen? Wie du eine Methode schreibst, die prüft ob eine Kollision aufgetreten ist, oder wie du feststellst welches Objekt mit welchem kollidiert? Oder was ganz anderes?.


nein, keins von beiden, ursprünglich wollte ich wissen wie ich am besten den ball von dem balken zurückwerfen lasse
[/QUOTE]





Antoras hat gesagt.:


> Ich würde da einen eigene Klasse Schläger erstellen, die Koordinaten besitzt, mit der man auf Kollisionen überprüfen kann.


diese klasse schläger war bei mir früher die klasse panel und jetzt sind es die klassen PanelVert und die Klasse PanelHoriz. die kollision wir mit intersects überprüft und war noch nie das problem





Antoras hat gesagt.:


> Danach würde ich eine Liste erstellen, die alle Objekte aufnimmt, mit denen eine Kollision auftreten kann.


ich habe keine liste, sondern eine abstrakt oberklasse aller spielobjekte die jedem objekt vorschreibt eine mathode zu haben, die kollision überprüft und entsprechend reagiert.





Antoras hat gesagt.:


> Dann kannst du die Objekte bequem mit einer Schleife durchgehen und auf Kollisionen überprüfen. Wenn dann eine Kollision auftritt, dann kannst du bequem den Typ des kollidierten Objektes prüfen und dann eine individuelle Aktion auslösen.


genau das mache ich mit dem folgenden code den ich auch schon mal gepostet habe
	
	
	
	





```
for (int i = 0; i < actors.size(); i++) {
            for (int n = i + 1; n < actors.size(); n++) {
 
                GameObject s1 = actors.get(i);
                GameObject s2 = actors.get(n);
 
                s1.collidedWith(s2);
 
            }
        }
```
man kann übrigens alles was ich grade geschrieben habe oben im thread nachlesen


----------

