# Kollision soll nur an oberer Seite (Breite) möglich sein



## L0g4n (12. Apr 2014)

Hallo Leute,

folgendes Problem:
Ich habe zwei Figuren. Beide haben um sie herum eine rechteckige Bounding Box.
Nun möchte ich beide auf Kollision prüfen.

Bisher habe ich ganz klassisch die Methode "overlaps", also simples überschneiden benutzt.
Jedoch möchte ich die Kollision noch besser dem Spiel anpassen. Da man sich eh nur nach rechts und links bewegen kann und die "Figur"  von oben herabfällt, muss man diese auffangen. 
Und jetzt soll die Kollision quasi nur zählen, wenn die herabfallende Figur die "Breite" der Spielfigur trifft. 
Das Ganze jetzt umzusetzen müsste eigentlich relativ einfach sein, jedoch stehe ich gerade auf dem Schlauch.

Ich benutze als Game-Framwork libGDX, die Rectangle Klasse, die ich benutze, kann man hier nachlesen:
Rectangle (libgdx API)

Ich benutze dabei OpenGL, das Koordinatensystem (hier im 2D Raum) beginnt (wie in der Schule) in der unteren linken Bildschirmecke.

Danke im Voraus!

LG


----------



## Androbin (12. Apr 2014)

Dann frag doch mal mit overlaps() den oberen Teil der Figur ab!
Allerdings kenne ich die overlaps()-Methode noch nicht! Erklärung bitte!


----------



## L0g4n (12. Apr 2014)

Ich habe die Dokumentation zum Framework doch verlinkt, hier nochmal der Link (du musst einfach die Methode overlaps da suchen und drauf klicken)
Rectangle (libgdx API))

Beachte, dass nicht die Standard Java API.

Die Overlaps Methode erwartet nur ein anderes Rechteck als Parameter, da kann man nichts spezifizieren ...


----------



## Androbin (12. Apr 2014)

Gut, dann erstellst du eben temporär ein neues Rechteck basierend auf dem alten und fragst das dann ab!


----------



## L0g4n (12. Apr 2014)

Die Frage ist ja genau, was ich abfragen soll, da ich im Moment nicht darauf komme.


----------



## Androbin (12. Apr 2014)

Du schreibst das dann ungefähr so:

```
if ( Rectangle1.overlaps( new Rectangle( Rectangle2.x, Rectangle2.y, Rectangle2.width, 1 ) ) ) { ... }
```
Du erstellst also temporär ein neues Rectangle basierend auf dem alten, aber mit anderer Höhe, also so wie das alte, jedoch bloß eine 1 Pixel dünne Version genau auf dem alten!


----------



## Ruzmanz (12. Apr 2014)

Sobald die Rechtecke überlappen, befindet sich der Spieler 1 Pixel im Boden. Okey ... dann positioniert man das Rechteck 1 Pixel über den Boden. Bewegt sich der Spieler zu schnell nach unten, ergibt sich wieder das selbe Problem ...

// Neue Position des Spielers berechnen
// Kollision erkennen:
if(spieler.x >= block.x && spieler.x+spieler.width <= block.x+block.width && spieler.y <= block.y+block.height) {
    // Position korrigieren, damit der Spieler nicht 1-X Pixel im Boden läuft.
    spieler.x = block.y+block.height+1;
}

Probleme:
- Wenn du das in Blöcken aufbaust, funktioniert die Logik nicht. Denn wenn der Spieler auf zwei Blöcken steht, dann fällt er einfach durch.
- Läuft / Fällt der Spieler seitlich in den Boden, wird er nach oben teleportiert.


----------

