1 Antwort

Dein Problem ist mehr ein mathematisches Problem, welches du erst einmal fernab von Java lösen solltest.

Zwei Flächen kollidieren miteinander, wenn sich ihre Kanten gegenseitig berühren oder überschneiden.

----------------
|   A          |
|       ------------
|       |  B   |   |
|       |      |   |
--------|-------   |
        |          |
        ------------

Dabei helfen die Positionskoordinaten für einen Abgleich:

  • Ist A.x <= B.x?
  • Ist A.x + A.width >= B.x?
  • Ist A.y <= B.y?
  • Ist A.y + A.height >= B.y?

Die Koordinaten x und y würden bei diesen Fragen den Punkt in der linken oberen Ecke des jeweiligen Rechtecks repräsentieren. Im 3D-Raum käme nun natürlich noch eine Ebene für die Überprüfung hinzu.

Soweit eine einfache Erklärung. Doch für deinen Fall ist es natürlich etwas komplizierter, da dein Ufo eben aus komplexeren Körpern besteht.

Was du folgend einmal recherchieren solltest:

  1. Wie man mathematisch prüft, ob eine Kugel eine Kugel berührt.
  2. Wie man mathematisch prüft, ob eine Kugel einen Kegel berührt.
  3. Wie man mathematisch prüft, ob eine Kugel einen Torus berührt.

Ein paar kurze Recherchen sollten aufzeigen, dass Lösungen dazu auch etwas mathematisches Verständnis erfordern.

Erst wenn du ganz genau verstehst, wie die Berechnung funktioniert, kannst du dich an eine Implementation in Java machen. Eine Aufteilung der Implementation in mindestens fünf Methoden wäre wohl anzuraten.

public boolean istKollidiert(Asteroid asteroid) {
  return istKollidiertMitRumpf(asteroid)
    || istKollidiertMitFluegel1(asteroid)
    || istKollidiertMitFluegel2(asteroid)
    || istKollidiertMitCockpit(asteroid);
}              

Eine Methode ruft alle vier Helfermethoden auf und verknüpft ihre Ergebnisse zu einem.

Die Asteroiden, die es gibt, solltest du in einer Liste, einem Array, o.ä. gespeichert haben. Bei jeder Bewegung des Ufos müsstest du dan einmal über alle verfügbaren Asteroiden iterieren und prüfen, ob sie das Ufo berühren.

shiroqqq 
Fragesteller
 24.04.2021, 00:55

Vielen Dank!

0