Feb 212013
 

In der letzten Lektion haben wir uns um das gelbe und das orange Rechteck gekümmert:

1

Nun werden wir uns um die Hände kümmern und hier auch gleich beide Arten, also vertikal und horizontal, programmieren. Aber bevor wir damit beginnen, lasst uns erst nochmal darüber reden, wie wir das genau anstellen wollen.

Für unseren Zweck müssen wir zwei Sachen überprüfen. Als Erstes müssen wir feststellen, ob der Roboter in der Luft oder am Boden ist, und als zweites, welches Rechteck eine Kollision hat.

Wenn wir nun in der Luft sind und auf den Boden zurück fallen, wollen wir nicht, dass unsere Hände mit irgendetwas kollidieren. Darum geben wir vor, dass wir dabei keine ausgestreckten Hände haben, sie also gar nicht existieren. Dies gibt uns aber wieder ein Problem, wenn wir auf dem Boden sind und die Hände mit etwas Kollidieren. Daher müssen wir uns darum auch kümmern.

Wenn wir uns auf dem Boden befinden, die geduckte Haltung ist hier komplett außen vor, wollen wir, dass als Erstes überprüft wird, ob die Arme mit etwas Kollidieren. Danach soll der Körper überprüft werden. Je nach Höhe unserer Plattformen wird die Kollision angezeigt. So muss nicht nach einer Kollision des Körpers geschaut werden, wenn die Hände schon kollidieren.

Nun, da wir uns eine Strategie ausgelegt haben, können wir beginnen. Versucht dies auch zu verinnerlichen, während wir programmieren. Alles ergibt einen Sinn, wenn wir die Strategie verstehen.

Seitliche Kollisionserkennung

Wir gehen nun fast genauso vor wie bei der Erstellung der beiden großen Rechtecke.

Erstellen der Rechtecke

Um die Rechtecke zu erstellen, öffnen wir die Robot Klasse und fügen diese hinzu. Wir werden für die linke Hand rect3 und für die rechte rect4 verwenden.

Als Nächstes müssen wir die Position der Rechtecke immer wieder neu anpassen, wenn sich unser Roboter bewegt. Dazu fügen wir den folgenden Code zur update()-Methode hinzu.

Wer gerne möchte, kann die beiden Rechtecke noch zeichnen lassen, dies ist nicht zwingend erforderlich. Dazu gehen wir in die paint()-Methode der StartingClass Klasse.

Wann soll nach Kollisionen geschaut werden?

In der letzten Lektion haben wir in der update()-Methode der Robot Klasse folgendes Statement geschrieben:

if (true)

Damit wird immer und überall nach Kollisionen geschaut. Das ist aber natürlich so nicht richtig und auch nicht Sinn vom Programmieren. Wir wollen nur, dass das Programm in der näheren Umgebung des Roboters nach Kollisionen schaut. Dazu nehmen wir nur diese 25 Felder:

1

Nun müssen wir unsere Statements mit diesen 25 Feldern ersetzen. Dazu müssen wir alle tileX Werte dieser 25 Felder nehmen, die unter den roten Balken gehören und alle Werte von tileY, die innerhalb des gelben Balkens liegen.

2 3

 

Also werden wir nun noch ein rotes Rechteck für die Breite und ein gelbes Rechteck für die Höhe erstellen. Alle Felder, die nun innerhalb dieser Abmessung sind, werden auf Kollisionen geprüft.

Erstellen des roten und des gelben Rechtecks

Dazu müssen wir nur zwei Änderungen an der Robot Klasse vornehmen.

Falls ihr dieses Rechteck nun auch ausgeben wollt, nehmt folgende Ergänzung an der paint()-Methode in der StartingClass Klasse vor.

Kollisionserkennung

Dazu müssen wir als Erstes die Tile Klasse öffnen. Mit dem Erstellen des roten und des gelben Rechtecks können wir nun den entsprechenden Code dem Programm hinzufügen. Dazu ändern wir den Konstrukteur wie folgt:

Damit stellen wir sicher, dass die leeren Felder nicht mit dem Roboter kollidieren. Diese Änderung haben wir auch schon in der letzten Lektion vorgenommen.

Wenn wir das getan haben, müssen wir die update()-Methode anpassen. Die Fehler die entstehen, werden wir gleich korrigieren. Wir programmieren nun, dass nur unsere 25 Felder nach Kollisionen überprüft werden.

Fehlerbehebung

Diese Änderungen haben nun zu einigen Fehlern in unserem Code geführt. Als Erstes fangen wir mit den footleft, footright Fehlern an.

Wir öffnen die Robot Klasse und erstellen zwei neue Variablen.

Nun gehen wir in die update()-Methode und fügen diese zwei neuen Rechtecke auch dort ein.

Diese zwei Rechtecke sind für die seitlichen Kollisionen da. Wir benutzen sie, wenn unsere Felder niedriger als die Arme sind. Die Rechtecke sind ein wenig neben unseren Füßen platziert und stehen dadurch etwas raus.

Nun müssen wir unsere oben erwähnten zwei Methoden noch einfügen. Dazu öffnen wir die Tile Klasse und nehmen folgende Änderungen bzw. Ergänzungen vor.

Wie ihr sicherlich bemerkt habt, sind in diesen beiden Methoden zahlreiche checks/tests enthalten. Bitte schaut euch diesen Code sehr genau an, bis ihr jeden Teil auch versteht.

Letzte Änderungen

Nun müssen wir noch eine kleine Änderung in der Robot Klasse vornehmen. Da wir nun das Fallen in unserem Kollisionscode überprüfen, können wir den Teil der update()-Methode ändern, wo wir das Springen programmiert haben.

Als Letzes können wir ohne Probleme noch unsere Rechtecke aus der paint()-Methode der StartingClass entfernen, da wir diese Anzeige nicht mehr benötigen.

Wenn ihr nun unser Spiel startet, habt ihr eine komplette Kollisionserkennung für den Roboter. Spielt ein wenig , aber passt auf die Schluchten auf. In der nächsten Lektion kümmern wir uns um unseren Heliboy.

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+, dass würde dieser Seite wirklich weiterhelfen, danke sehr. Auch ein Klick auf die Werbung hilft dabei, diese Seite am Laufen zu halten.

Source Code

Für diejenigen unter euch, die hier einsteigen möchten, ohne den ganzen Code abtippen zu müssen, habe ich das Projekt exportiert. Mit der Importfunktion könnt ihr das Projekt bequem bei euch einfügen. Unter der Kategorie Eclipse und Java > Import und Export habe ich erklärt, was dafür zu tun ist.

Kapitel 3 Lektion 6

Quelle: Original Anleitung auf englisch von Kilobolt Studios

Lektion 5 – Kollisionserkennung Teil 1 Lektion 7 – Kollisionserkennung Teil 3