Kollidierung zweier Objekte in java/bluej?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Dass du die X-Koordinate vom einen Objekt mit der Y-Koordinate vom anderen Objekt vergleichst, macht irgendwie nicht viel Sinn. Wenn, dann müssen X und Y-Koordinate von beiden Objekten ungefähr gleich sein (der Unfall soll ja schon registriert werden, wenn die Mittelpunkte beider Objekte ein paar Pixel auseinander sind und nicht nur, wenn sie sich genau überlagern).

Ich hab dir mal zur Veranschaulichung was kurzes zusammengebastelt:

package de.daCypher.exercises;

import java.awt.Point;

import javax.swing.JOptionPane;

public class Collision {
	public static void main(String[] args) {
		Auto nAuto = new Auto(Auto.Richtung.runter);
		Auto sAuto = new Auto(Auto.Richtung.hoch);
		Auto wAuto = new Auto(Auto.Richtung.rechts);
		Auto oAuto = new Auto(Auto.Richtung.links);
		
		if (nAuto.getKollision(oAuto)) {
			msg("Crash zwischen Nord und Ost");
			return;
		} else {
			oAuto.bewegen(150);
			nAuto.bewegen(50);
		}
		
		if (nAuto.getKollision(wAuto)) {
			msg("Crash zwischen Nord und West");
			return;
		} else {
			wAuto.bewegen(5);
			nAuto.bewegen(50);
		}	
		
		// und so weiter
	}
	
	private static void msg(String message) {
		JOptionPane.showMessageDialog(null, message);
	}
}

class Auto {
	Point position;
	Richtung richtung;
	private final int MINDESTABSTAND = 10;
	
	Auto(Richtung richtung) {
		this(richtung, richtung.start);
	}
	
	Auto(Richtung richtung, Point position) {
		this.richtung = richtung;
		this.position = position;
	}
	
	enum Richtung {
		hoch(0,-1, 50, 100),
		runter(0,1, 50, 0),
		links(-1,0, 0, 50),
		rechts(1,0, 100, 50);
		
		Point vektor;
		Point start;
		
		Richtung(int vektorX, int vektorY, int startX, int startY) {
			vektor = new Point(vektorX, vektorY);
			start = new Point(startX, startY);
		}
	}
	
	void bewegen(int entfernung) {
		this.position.translate(this.richtung.vektor.x * entfernung, this.richtung.vektor.y * entfernung);
	}
	
	boolean getKollision(Auto anderesAuto) {
		return (Math.abs(this.position.x - anderesAuto.position.x) < MINDESTABSTAND
				&& Math.abs(this.position.y - anderesAuto.position.y) < MINDESTABSTAND);
	}
}

Was am interessantesten für dich ist, ist die "getKollision"-Methode in der Auto-Klasse. Die prüft, ob die X und Y Koordinaten der beiden Autos dichter beieinander sind, als der Mindestabstand. In der Main-Methode kannst du einfach die getKollision-Methode der Autos aufrufen, die du prüfen willst und falls sie gecrasht sind, wird eine Meldung angezeigt und das Programm beendet (alternativ kannst du natürlich auch nur eine Schleife beenden oder so)


Evoli1410 
Beitragsersteller
 10.10.2020, 18:56

Vielen Dank für die Hilfe! Ja es tut mir leid wenn das was ich da versucht habe nicht so wirklich Sinn ergibt... ich habe grade erst angefangen zu lernen und kann wirklich nicht sagen dass ich weiß was ich tue. Danke auch für die Mühe die du in deine Antwort gesteckt hast!!

0
daCypher  12.10.2020, 08:21
@Evoli1410

Ist doch alles gut. Jeder hat mal klein angefangen. So ist es auf jeden Fall besser, als wenn du es gar nicht erst versucht hättest.

1

Wenn du bereits erkennen kannst, dass die Autos kollidiert sind aber sie sich noch weiter bewegen könntest du bei der Kollision eine Variable (zB boolean unfall) auf true setzen und bevor du das Auto dann bewegst abfragen ob ein Unfall zustande gekommen ist.