OOP Kollision entdecken

manuw

Neues Mitglied
Hallo erstmal ;)

Ich habe mir ein kleines Fenster gebaut in dem ich kleine Punkte rumfliegen lasse ;)
Soweit so gut.

Nun ist es so das ich gerne bei Kollision 2er Punkte irgendwas auslösen würde. Also entweder das sie sich von einander abstoßen oder verschmelzen, whatever. Das ist aber nicht mein Problem. Mein Problem ist es raus zu finden wann 2 Punkte miteinander Kollidieren.

Das Fenster an sich ist ein einfaches Frame. Ein Punkt (Ich nenne sie bei mir Bullet) ist eine eigene Klasse. Jedes Bullet ist ein eigener Thread.

Die Bullets selber verwalte ich in Container.java:
Java:
public class Container {
   public static ArrayList<Bullet> container = new ArrayList<Bullet>();
}

Die Bullet Klasse speichert die aktuelle Position, es gibt also x und y sowie die dazugehörigen getter.

Also ich kann z.b. mit ...
Java:
Container.container.get(Index).getX();
... darauf zugreifen.

Kann hier vll mir jemand einen Ratschlag geben? Liegt vll auch an der Uhrzeit das ich einfach nicht mehr drauf komme :p

Lg Manuel
 

Ralph-Uwe

Bekanntes Mitglied
Moin,

Du brauchst doch nur die einzelnen Positionen Deiner Arrylist miteinander vergleichen,
Allerdings sollte dabei berücksichtigt werden, dass die Bullets an der äusseren Hülle
zusammenstoßen und nicht in der linken oberen Ecke. ( ich vermute, dass das die aktuelle Position ist)
Dabei könnte es hilfreich sein für jedes Bullet einen Kollisionspunkt zu ermitteln,
also ein Punkt auf dem Radius an der Stelle in die der Bullet fliegt.
 

Quaxli

Top Contributor
...Jedes Bullet ist ein eigener Thread. ...

Das ist ein bißchen arg und nicht nötig. Für einfache Animationen reichen 2 Threads: Der EDP und ein Animationsloop innerhalb dessen alle Punkte bewegt werden, Logiken geprüft werden, etc..
Guck' mal in mein Tutorial in der Signatur, da sind auch nur 2 Threads am Werke.

Die Bullet Klasse speichert die aktuelle Position, es gibt also x und y sowie die dazugehörigen getter.
Also sowas wie java.awt.Point :D:D:D

Ansonsten würde ich zunächst einfach mal die x/y-Werte vergleichen. Wenn Deine Punkte wirklich nur 1 Pixel groß sind, ist es vermutlich unerheblich, ob sie sich kurz überschneiden oder mit den Außenseiten kollidieren. Einfach mal ausprobieren und schauen, ob es Dir gefällt.
Wenn Deine Punkte nur 1 Pixel groß und recht schnell sind, hast Du hier aber u. U. das Problem, daß eine Kollission nicht bemerkt wird, weil der eigentliche Kollisionspunkt "übersprungen" wird. Die Frage ist, ob das bei so kleinen Punkten auffällt? Falls ja, müßtest Du noch ein wenig "in die Zukunft" rechnen.

Sollten Deine Objekte größer werden als 1 Pixel würde ich die Klasse von Rectangle oder Rectangle2D erben lassen. Dann kannst Du nämlich mit der Methode intersects auf Kollissionen prüfen.
 

manuw

Neues Mitglied
Achso ja. Meine erste Version war auch die das ich in den einzelnen Bullet.run() die Arraylist durch bin und gegen die aktuelle Position des Bullets geprüft habe.
Meine Frage war eher, ob das vll auch effizienter geht.

Meine Bullets haben übrigens 10 Pixel größe, hatte ich vergessen zu sagen ;)
 

Quaxli

Top Contributor
Dann würde ich Bullet von Rectangle oder Rectangle2D.Double erben lassen und zur (ersten) Kollisionsermittlung intersects(...) verwenden.
Dann erbst Du auch schon mal alles was Du brauchst um Position, Höhe und Breite zu speichern.
 

Ähnliche Java Themen

Neue Themen


Oben