Steinreihe verschwindet komplett

Status
Nicht offen für weitere Antworten.

casca

Mitglied
Guten Abend,

wir programmieren nun schon ein paar Wochen an diesem Spiel. Es handelt sich um Outbreak. Man besitzt einen Schläger den man auf einer x-achse hin und her bewegen kann und somit versucht einen Ball gegen Steine zu schießen.
Die Steine verschwinden und geben Punkte.

Im Moment klappt auch alles, bis auf die Wiedergabe der gemachten Punkte und die richtige Kollision(?) bzw wir glauben es liegt an der Kollision.

Immer wenn der Ball Höher als eine Steinreihe kommt, verschwindet sie komplett. Jedoch, wenn er normal einen Stein trifft, funktioniert alles perfekt und nur der einzelne Stein verschwindet.

Hier ist der Code-Schnipsel für die Kollision, vielleicht findet ihr ja was, ich sitze seit 4 Stunden dran :[
Falls ihr noch weitere Dinge braucht, sagt bescheid.

Code:
public void kollision() {

		for (int i = baustein.size()-1; i >= 0; i--) {
			
			// Kollision von oben
			if ( baustein.get(i).getPosition().getY() >= position.y
					+ BALLSIZE / 2 && baustein.get(i).getPosition().getX() <= position.x
					&& position.x <= baustein.get(i).getPosition().getX()
							+ baustein.get(i).getSW()) {
				kollidiert = true;
				dy = -dy;
			}

			// Kollision von unten
			else if (baustein.get(i).getPosition().getY() + baustein.get(i).getSH() >= position.y
					- BALLSIZE / 2
					&& baustein.get(i).getPosition().getX() <= position.x
					&& position.x <= baustein.get(i).getPosition().getX()
							+ baustein.get(i).getSW()) {
				kollidiert = true;
				dy = -dy;
			}

			// Kollision von links
			else if (baustein.get(i).getPosition().getX() <= position.x
					+ BALLSIZE / 2 && baustein.get(i).getPosition().getY() <= position.y
					&& position.y <= baustein.get(i).getPosition().getY()
							+ baustein.get(i).getSH()) {
				kollidiert = true;
				dx = -dx;
			}

			// Kollision von rechts
			else if (baustein.get(i).getPosition().getX()
					+ baustein.get(i).getSW() > position.x 
					- BALLSIZE / 2 && baustein.get(i).getPosition().getY() <= position.y
					&& position.y <= baustein.get(i).getPosition().getY()
							+ baustein.get(i).getSH()) {
				kollidiert = true;
				dx = -dx;
			}
			
			if(kollidiert == true){
				baustein.remove(i);
				punkte = gp.getScore() + 100;
				gp.setScore(punkte);
				System.out.println("Score: "+ gp.getScore());
				kollidiert = false;
			}
		}
	}

Die ganze Methode befindet sich in der Klasse -> Ball.java :]
 

Wildcard

Top Contributor
Ein Stein ist doch vermutlich ein Rechteck?
Rectangle hat eine intersects Methode, das sollte die Sache deutlich vereinfachen...
 

casca

Mitglied
Jep, der Baustein ist ein kleines Rechteck.
Eh und bitte was ? :D

Ich kann das was ich oben geschrieben habe zwar programmieren, aber was du gerade mir erzählt hast, eh was ? :[
 

Wildcard

Top Contributor
In Java gibt es das Interface Shape. In deinem Fall wären Rectangle2D und Ellipse interessant, die beide dieses Interface erfüllen.
Wenn du nun deinen Ball als Ellipse ansiehst und deinen Stein als Rectangle2D, dann reicht ein einfaches ball.intersects(rectangle) um eine Kollision festzustellen und der ganze Code da oben wird durch eine Zeile erstetzt.
 

casca

Mitglied
Ja, so wollte ich es ursprünglich machen. Dennoch hat mir mein Lehrer ein Strich durch die Rechnung gemacht. Wir sollen mit Buffered Images arbeiten bzw Costum-Grafiken :<
 

Wildcard

Top Contributor
Was hat das damit zu tun?
Die Visualisierung eines Objekts sagt nichts über die Logik dahinter aus.
Die Shapes verwendest du um Form und Position deiner Objekte zu bestimmen.
 

Quaxli

Top Contributor
@Casca:

Guck mal in mein Tutorial, dann siehst Du, was Wildcard meint. Alle angezeigten Objekte dort erben von Rectangle2D. Das Tutorial findest Du hier.
Nicht erschrecken wegen der Größe, es erstaunt mich auch immer wieder wie groß es geworden ist..... :cool:
Die Seiten 13 - 22 zeigen Dir, wie ein Objekt aussehen kann, daß von einem Rechteck erbt ;)
Ab Seite 61 geht es um einfache Kollisionen. Letzten Endes genau das, was Wildcard oben erwähnt hat.
 
Status
Nicht offen für weitere Antworten.

Oben