# Kollision



## .basti (17. Feb 2022)

Hey,
in meinem Spiel möchte ich jetzt eine Plattform einbauen auf die der Spieler springen kann. Die Kollision frage ich mit zwei Rectangle ab (eins für den Spieler, eins für die Plattform). Das wird dann aber immer ausgelöst wenn der Spieler die Plattform berührt, ich möchte allerdings dass man unter der Plattform durchspringen kann und nur auf ihr stehen bleibt wenn die "Füße" vom Spieler auf der Plattform stehen.
Hier noch die Methode mit der ich die Kollision abfrage:

```
public boolean kollision(Spielfiguren p) {
        return getCollisionBox().intersects(p.getCollisionBox());
    }
```
getCollisionBox() ist der Name meines Rectangle.
Die größe des jeweiligen Rectangle setze ich in einer Subklasse.
Meine Frage ist jetzt wie ich das mache, dass der Spieler durchspringen kann und auf ihr stehen bleibt.


----------



## Gelöschtes Mitglied 65838 (17. Feb 2022)

was nimmst du überhaupt her ? pures javafx ? fxgl?

die einfachere art und weise wäre es den mittelpunkt des rechtecks zu bestimmen -> falls der mittelpunkt unter dem rechteck ist dann kannst du durchgehen


----------



## .basti (17. Feb 2022)

Ich versteh nicht so ganz was du meinst. Vielleicht muss Ichs nochmal genauer erklären. Ich zeichne auf mein JPanel ein Rechteck und einen Spieler. Der Spieler kann mit Leertaste Springen. Jetzt möchte ich erreichen, dass er auf mein Rechteck springen kann. Mit der oben beschriebenen Methode klappt es, allerdings wird das immer ausgeführt wenn ich das Rechteck berühre und nicht nur wenn ich oben drauf stehe.

```
if(pf.kollision(spieler)) {
            spieler.setPosition(spieler.getX(), pf.getY()-spieler.getImage().getHeight());
        }
```
pf ist mein rechteck. Bei setPosition wird hier einfach der x wert beibehalten, da der sich ja nicht ändern soll, der y wert setzt sich aus dem y wert von pf zusammen und dem der Höhe des Spielers (Spieler ist ein BufferedImage). Die Höhe muss ich abziehen da bei Bildern immer die obere Kante genannt wird, ich ja aber die untere brauche. 
Wie gesagt wenn ich meine if Anweisung so stehen lasse das wird mein Spieler immer auf die jeweilige Position gesetzt, egal ob ich das Rechteck unten, oben, links oder recht berühre. Mein Ziel ist es aber dass diese Position nur gesetzt wird wenn ich auf der oberen Kante des Rechtecks stehe, also meine untere Kante des Bildes auf der Höhe ist.
Ich hatte auch folgenden anderen Ansatz welche aber nicht funktioniert hat:

```
if(spieler.yUnten()==pf.getY()) {
            spieler.setPosition(spieler.getX(), pf.getY()-spieler.getImage().getHeight());
        }
```
yUnten() beschreibt einfach den y wert der unteren Kante vom Spieler. Wenn ich die if Anweisung so stehen lassen Passiert gar nichts.


----------



## Gelöschtes Mitglied 65838 (17. Feb 2022)

du kannst halt entscheiden in welcher position sich der spieler bezüglich des rechteckes befindet

wenn du dir deine situation als koordinaten system vorstellst und P ( 0 , 0 ) das zentrum deines rechteckes ist ( das musst du noch relativieren )

nur wenn der vector P ( -/+ X und + Y ) ist relativ zum rechteck dann bist du überhalb => dann musst du drauf springen


ansonsten nicht
dh dein rechtecks zentrum ist bei

P ( 0 , 50 )
wann bist du dann drüber  ?
bei allem was
P ( 0  , 50 + charaktermittelpunkt ) ist => die "relativierung" musst du noch einbauen
gibt bestimmt was einfacheres aber so hast du halt mal in vectoren mathematik gleich mit rein geschaut


----------



## .basti (21. Feb 2022)

Danke für deine Hilfe allerdings hab ich jetzt einen anderen Weg gefunden. Und zwar prüfe ich ob er hoch oder runter geht. Und nur wenn er runter geht kann er auch drauf stehen bleiben


----------



## Neumi5694 (1. Mrz 2022)

.basti hat gesagt.:


> Danke für deine Hilfe allerdings hab ich jetzt einen anderen Weg gefunden. Und zwar prüfe ich ob er hoch oder runter geht. Und nur wenn er runter geht kann er auch drauf stehen bleiben


Das hast du sogar in deiner Aufgabenstellung im ersten Post beschrieben


----------

