Feb 212013
 

In dieser Lektion wollen wir über die Grundlagen der Kollisionserkennung reden und wie man diese implementiert.

Was genau ist eigentlich Kollisionserkennung?

Einfach gesagt, geht es darum, wie zwei Objekte mit einander interagieren.

In den meisten Spielen ist die Kollisionserkennung ein Basisbestandteil. Wenn wir eine schlechte Umsetzung haben, kann dies wirklich frustrierend sein. Man kann sagen, dass davon der Erfolg eines Spiels abhängt, da niemand halbfertige oder kaputte Spiele mag.

Bei der Implementierung der Kollisionserkennung sollte daher immer der größtmöglichste Aufwand betrieben werden, sodass diese so flüssig wie möglich abläuft.

Wie genau muss die Kollisionserkennung sein?

Das hängt immer vom Spiel ab. Haben wir ein sehr schnelles Spiel, vermag der Spieler es nicht immer erkennen, wenn die Figur schon etwas früher getroffen wird. Haben wir ein Actionspiel und die Figur wird ständig vor dem Eintreffen der Kugel getroffen, kann das auf Dauer schon sehr nervig sein.

Die einfachste Methode, den richtigen Weg zu finden, sind Tests, Tests, Tests.

Gibt es auch Beispiele der Kollisionserkennung?

Jeder kennt Mario. Wenn wir das spielen und springen nach einer Münze, überprüft das Spiel, ob wir diese getroffen haben. Ist das der Fall, entfernt das Spiel die Münze vom Bildschirm und addiert diese zum Spielstand.

Wenn ihr gerade erst anfangt, Spiele zu entwickeln, solltet ihr zunächst wissen, dass es einige eingebaute Methoden gibt, welche prüfen, ob eure Objekte miteinander kollidieren, da der Computer mit Pixeln allein nicht viel anfangen kann, weil diese nur der visuellen Darstellung dienen.

Das Rechteck zur Kollisionserkennung

Die einfachste Methode, Kollisionen zu erkennen, ist, ein Rechteck um die Spielfigur zu setzen.

1

 

Wenn in einem Spiel ein Gegenstand die Form eines Rechtecks besitzt, ist dies die richtige Methode. Hier wird überprüft, ob in einem bestimmten Abstand vom Zentrum vertikal oder horizontal eine Berührung mit einem anderen Objekt stattfindet. Je nachdem, wo die Kollision stattfindet, wird die Spielfigur nach oben, unten oder zu einer Seite gedrückt.

2

 

Programmieren lässt sich dieses Beispiel recht einfach:

MegaMan.right soll hier unsere X-Koordinate der rechten Seite unseres Rechtecks sein.
Megaman.vX ist die Bewegung unserer Figur in X-Richtung.
brick.left ist die X-Koordinate unseres Steins, in diesem Fall von der linken Seite.

Beispiel Code:

if (MegaMan.right + MegaMan.vX > brick.left){
   System.out.println(„Rechte Seite kollidiert!“) ;  
   // Kollision bearbeiten

Wenn wir diesen Code nun für jede der vier Seiten schreiben würden, hätten wir ein rechteckiges Kollisionssystem um unsere Spielfigur aufgebaut.

Wie genau behandeln wir aber nun Kollisionen?

Wenn wir im obigen Beispiel die Geschwindigkeit von Mega Man MegaMan.vX gleich 0 setzen, würde Mega Man aufhören, sich zu bewegen. Zusätzlich könnten wir die Position von Mega Man ändern, so dass sich die zwei Rechtecke zwar berühren, sich aber nicht überlappen, d. h. wenn der Stein von rechts kommt und gegen den Mega Man stößt, schiebt der Stein ihn nach links. Dadurch enstehen nicht ständig neue Kollisionen.

Wie verbessern wir unsere Kollisionserkennung?

Unser erstes Beispiel ist nicht wirklich genau, wie man am nächsten Bild sieht.

3

Mit dieser Methode hätte es den Anschein, unsere Spielfigur sei getroffen worden, obwohl dies eigentlich gar nicht der Fall ist. Das würde zu einem schlechten Benutzererlebnis führen, weshalb wir das anders lösen sollten.

Hier sind einige alternative Lösungen, die ihr vielleicht ausprobieren solltet.

1. Kleineres Rechteck

Man könnte nun einfach das Rechteck verkleinern, so dass es am besten zur Spielfigur passt. Dies erhöht den Spielfluss erheblich und ist für viele Spiele ausreichend.

4

 

Wenn unser Spiel aber etwas mehr Genauigkeit benötigt, gibt es eine weitere Methode.

2. Mehrere Rechtecke

Wenn das Spiel wissen muss, wo unsere Figur getroffen wurde oder wir eine genauere Methode benötigen, kann man anstatt eines umschließenden Rechtecks mehrere verwenden:

5

 

Diese Methode gibt uns die Sicherheit, die Kollisionen so genau wie möglich zu berechnen. Man muss aber auch sagen, dass die Performance des Spiels darunter leiden kann, wenn sehr viele Kollisionen berechnet werden müssen und dass eine Menge Zeit benötigt wird, den dafür benötigten Code zu implementieren.

Runde Kollisionen

Wenn in dem Spiel viel mit runden Spielfiguren gearbeitet wird, kann man diese nicht wirklich in Rechtecke fassen, hier bietet sich ein Kreis an.

6

 

Und es ist einfacher zu implementieren, als man vielleicht denkt, da Kreise immer einen konstanten Radius haben.

7

 

Hier haben beide Spielfiguren einen Radius, R1 und R2. Nimmt man nun einen Kreis als Grundlage, kann man Folgendes sagen:

1. Ist der Abstand der Mittelpunkte der beiden Spielfiguren größer als R1 + R2, dann haben wir keine Kollision.

2. Ist der Abstand der Mittelpunkte der beiden Spielfiguren kleiner als R1 + R2, dann haben wir eine Kollision.

Wie kann man das aber nun implementieren?

Nehmen wir an, wir wissen die X- und Y-Koordinaten unserer Kreise. Nun müssen wir einfach die Entfernung der beiden Kreise berechnen, hierzu nehmen wir den Pythagoras sqrt( (x1 – x2)^2 + (y1 – y2)^2).

Nun müssen wir nur noch diesen Wert mit R1 + R2 vergleichen.

Und wenn sie voneinander abprallen sollen?

Das wäre ein wenig komplizierter und es würde uns viel Zeit kosten, dies zu implementieren, aber es wäre machbar.

Wenn wir nun ein Dreieck zwischen die beiden Mittelpunkte zeichnen würden, könnten wir den Winkel des Aufpralls errechnen.

8

 

Rechtecke und Kreise

Es gibt natürlich auch die Möglichkeit, beide Optionen in einem Spiel unterzubringen.

9

 

In den nächsten Lektionen werden wir einige dieser Methoden in unser Spiel implementieren.

Falls ihr Fragen habt, immer raus damit, ich helfe euch sehr gerne. Hinterlasst bitte einfach einen Kommentar.

Teilt diese Seite mit euren Freunden und besucht uns mal auf Facebook und auf Google+, das würde dieser Seite wirklich weiterhelfen, danke sehr. Auch ein Klick auf die Werbung hilft dabei, diese Seite am Laufen zu halten.

Quelle: Original Anleitung auf englisch von Kilobolt Studios

Lektion 3 – Level erstellen Teil 3 Lektion 5 – Kollisionserkennung Teil 1