Frage von gut4fr5g4, 16

Libgdx Collision detection mit transparentem rectangle?

Wie kann ich eine collision detection machen in libgdx mit einem normalem sprite und einem transparentem rectangle?

Wäre echt nice, wenn mir jemand hilft!

Antwort
von Springrbua, 7

Es ist wichtig, dass du die Logik und die View voneinander trennst.

Das heißt, du wirst keine Collision detection zwischen einem Sprite und einem Rectangle machen, sondern du wirst eine Collision detection zwischen zwei Objekten machen und den Sprite/das Rectangle abhängig vom Ergebnis zeichnen.

Das heißt jedes Objekt sollte ein Datenmodell haben, welches Position und Größe speichert. In der "render" Mthode machst du zunächst einen Durchlauf, in welchem du die Positionen aktualisierst. Dabei berechnest du anhand der Geschwindigkeit des Objektes die neue Position und kontrollierst, ob diese gültig (also Frei ist und auf dem Weg keine Kollision stattgefunden hat) ist.

Falls sie gültig ist, setzt du die neue Position des Objektes, falls nicht, musst du die letzte gültige Position berechnen.

Anschließend machst du den wirklichen render-Durchlauf, in welchem du die Objekte, abhängig von der neuen Position und Größe zeichnest.

Es ist also völlig egal, ob es ein transparentes Rectangle oder ein Sprite ist. Die Collision detection MUSS unabhängig von der View sein. Die View hingegen sollte sich auf das Ergebnis der Collision detection stützen und somit an der richtigen Position rendern.

LG

Kommentar von gut4fr5g4 ,

danke!

Kannst du das nochmal an einem beispiel zeigen? habs nicht so ganz verstanden :c 

Kommentar von Springrbua ,

Beispiel ist etwas schwer... Ich versuche es aber nochmal genauer zu erklären:

Im Prinzip benötigst du für jedes deiner Objekte eine Klasse, welche die Logik kapselt. Z.B. hast du eine Klasse "Ball", welche eine Position, einen Radius, eine Geschwindigkeit und eine Richtung hat.

Zudem hast du eine Zentrale Klasse (kann auch nur eine Liste sein), welche die Objekte deines Spieles beinhaltet, in diesem Fall die Bälle.

In der render-Methode kannst du nun zunächst die Position deiner Objekte aktualisieren. Dazu kannst du die Liste durchlaufen und für jedes Objekt folgende Schritte durchgehen:

  1. Neue Position berechnen
  2. Kontrollieren, ob die neue Position frei ist (Collision detection)
  3. Bei Kollision entsprechend handeln (z.B. die Position korrigieren, Geschwindigkeit oder Richtung ändern...).
  4. Falls keine Kollision stattgefunden hat, die berechnete neue Position setzen.

Der 2te Punkt hängt natürlich von deinen konkreten Objekten bzw, deren Hitbox ab. Zwei Bälle (Kreise) kollidieren z.B. wenn die Distanz zwischen den Positionen (Distanz der Mittelpunkte) kleiner als die Summe der Radien ist.

Nach dem du das gemacht hast, haben alle deine Objekte eine gültige Position. Das heißt du kannst sie erneut alle durchlaufen und an der entsprechenden Position rendern.

Kommentar von gut4fr5g4 ,

habe vorhin eine neue frage dazu gestellt, kannst du mal eben gucken und mir eventuell bei meinem problem helfen?

danke jetzt schonmal ;)

Kommentar von Springrbua ,

Der dort gepostete Link führt zu zwei weiteren Links, nicht direkt zum Code... Ich würde das ändern, sonst werden dir nicht besonders viele Helfen...

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten