ping pong ball abprallen lassen

Java-Freak

Bekanntes Mitglied
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:
Java:
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!
 

Anhänge

  • spiel.png
    spiel.png
    11,6 KB · Aufrufe: 97

Geeeee

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

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

Gast2

Gast
Probiers vllt mal so:

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

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

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

Bekanntes Mitglied
:D nicht von JPanel sondern von meiner klassen Panel
mein programm ist etwas anders aufgebaut:
ich hab eine klasse
Java:
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
Java:
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:
Java:
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
Java:
@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.
 
Zuletzt bearbeitet:

Geeeee

Bekanntes Mitglied
:D 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) :D
 

Java-Freak

Bekanntes Mitglied
was schreibe ich denn da doppelt?
ich schreibe einfach entweder im ball
Code:
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
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
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
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
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
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
Java:
package own.game.one;
import java.awt.Graphics;

public interface Drawable {

	public void drawObjects(Graphics g);
	
}
Movable.java
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
 
Zuletzt bearbeitet:

Geeeee

Bekanntes Mitglied
Ich bezog mich auf die Aussage:
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

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

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

Bekanntes Mitglied
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]
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
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.
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
Java:
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Ping Pong Spiele- und Multimedia-Programmierung 4
M Einfaches Ping-Pong Spiel Spiele- und Multimedia-Programmierung 3
1 Ping Pong langsam Spiele- und Multimedia-Programmierung 13
L Java Ping Pong Spiele- und Multimedia-Programmierung 1
S Ping Pong: KeyListener in Paint und while Spiele- und Multimedia-Programmierung 10
G Ping Pong Frage Spiele- und Multimedia-Programmierung 17
B Ping Pong Spiele- und Multimedia-Programmierung 11
R Ping Pong Spiel Fehlermeldung Spiele- und Multimedia-Programmierung 12
R Ping Pong Spiel Spiele- und Multimedia-Programmierung 28
J Probleme bei Pong Spiele- und Multimedia-Programmierung 9
J Pong Programm Spiele- und Multimedia-Programmierung 1
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
T Torquemada´s erstes Game (Pong) Spiele- und Multimedia-Programmierung 5
A Pong Grafikgestaltung Spiele- und Multimedia-Programmierung 10
R Pong -Reruns möglich machen Spiele- und Multimedia-Programmierung 2
Y Pong Spiel Score Zähler! -.- Spiele- und Multimedia-Programmierung 18
U Pong Spiele- und Multimedia-Programmierung 7
BattleMaster246 Pong - JOGL Spiele- und Multimedia-Programmierung 2
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
M Fragen zu meinem Pong-Clone Spiele- und Multimedia-Programmierung 6
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
G Pong klon mit Steuerungsprobleme Spiele- und Multimedia-Programmierung 8
B Pong-Klon. Denkfehler bei kollisionstest Spiele- und Multimedia-Programmierung 3
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
G Pong-Klon (Applet!) Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19
K Ball abschießen? Spiele- und Multimedia-Programmierung 1
K Ball abschießen Spiele- und Multimedia-Programmierung 1
P Ball mit schwerkraft hüpfen lassen Spiele- und Multimedia-Programmierung 9
Developer_X THE BALL (needs Java3D) Spiele- und Multimedia-Programmierung 34
S Ball Problem Spiele- und Multimedia-Programmierung 7
S Ball is Kaputt Spiele- und Multimedia-Programmierung 17
U Ball programmieren Spiele- und Multimedia-Programmierung 26
T Kollisionsabfrage von einem Stein mit einem Ball Spiele- und Multimedia-Programmierung 5
G Balken, der Ball zurückschießt Spiele- und Multimedia-Programmierung 7
J Kollisionsabfrage Ball <-> Paddle Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben