Kapitel 3 Lektion 6 – Kollisionserkennung Teil 2
In der letzten Lektion haben wir uns um das gelbe und das orange Rechteck gekümmert:
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.
[crayon-62c27c46d9443320176836/]
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.
[crayon-62c27c46d9452366124670/]
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.
[crayon-62c27c46d9459276318279/]
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:
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.
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.
[crayon-62c27c46d9460082172264/]
Falls ihr dieses Rechteck nun auch ausgeben wollt, nehmt folgende Ergänzung an der paint()-Methode in der StartingClass Klasse vor.
[crayon-62c27c46d9467246430938/]
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:
[crayon-62c27c46d946d512664163/]
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.
[crayon-62c27c46d9472985673686/]
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.
[crayon-62c27c46d9476158597243/]
Nun gehen wir in die update()-Methode und fügen diese zwei neuen Rechtecke auch dort ein.
[crayon-62c27c46d947b650863870/]
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.
[crayon-62c27c46d9481025148474/]
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.
[crayon-62c27c46d9486461854947/]
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.
Quelle: Original Anleitung auf englisch von Kilobolt Studios
Lektion 5 – Kollisionserkennung Teil 1 Lektion 7 – Kollisionserkennung Teil 3
Hey zusammen , also habe da eine Frage und zwar ich möchte eine App erstellen nur weis ich leider nicht wie das geht . Werde mich die Tage hier mal durchlesen , meine Frage ist wie, wo und was kostest es eine App zu erstellen . Ich möchte mit dieser App auch Geld verdienen später und wie genau wird dies dann funktionieren ? Dachte an Werbung schalten in meiner App und diese App kostenlos anbieten .
Danke schonmal für sie Hilfe und hoffe auf gute Infos
So langsam wächst mein Spiel, gefällt mir! Was mir hier aufgefallen ist bzw. was ich nicht verstehe:
Wozu die roten und gelben Rechtecke? Wäre es nicht sinnvoller, z.B über die Koordinaten des Robots zu gehen? Das sieht mir nach doppelte Arbeit – ich könnte sonst doch gleich den Bereich zur Kollisionskontrolle eingrenzen, da ich ja die Koordinaten des Roboters kenne?
Und ein Vorschlag zur Verbesserung, die Idee kam mir auch schon ganz am Anfang: Warum nicht den Robot aus mehren Teilen darstellen und nicht als ein einziges Bitmap. Also: Kopf, Rumpf, Beine und Arme als eigenständige Bitmap ablegen und dann dazu dann die Objekte jeweils ausrichten.
Das würde auch den Umweg über die Recangles für die Kollisions-Erkennung vermeiden und man hätte noch dazu eine wirklich exakte Kollisionserkennung.
Hallo
Da gebe ich dir recht, klar wäre das so einfacher. Es müssen aber erstmal Grundlagen gelegt werden. Daher hat man diesen weg gewählt.
Grüße
Da habe ich doch glatt etwas vergessen 🙂
Wenn du denn weg mit jeden einzelnen Körperteil programmiert hast oder gerne tun möchtest, kann ich diesen dann gerne hier veröffentlichen.
Hallo,
auch von mir erst mal ein lob für dein Tutorial, da steckt eine menge arbeit drin.
Ich habe ein ähnliches Problem. Mein Roboter stürzt sich nur widerwillig in die Schlucht.
Ich kann über die Schlucht laufen. Bin ich aber im „jumped-Modus“, dann stürzt er auch wirklich ab. Ich glaube das Problem besteht schon etwas länger. Ich habs nur erst jetzt als Fehler identifiziert.
MfG Chris
Hallo,
vielen Dank für das Tutorial.
Habe an dieser Stelle ein Problem: mein Roboter stürzt ab, sobald ich das Spiel starte. Habe es bisher ignoriert, da irgendwo stand, daß die Roboterbewegung nicht mehr korrekt funktioniert. Wo kann ich nach dem Fehler suchen?
LG
Hallo
das sieht ganz danach aus, als ob du die untere Begrenzung nicht programmiert hast. Also deinen Untergrund. Gehe zurück wo wir den Roboter programmiert haben und schaue nochmal nach. Ohne diese Begrenzung geht es nicht.
In den späteren Kollisionslektionen, werden wir dies aber umprogrammieren. Genaueres in den Lektionen
Grüße
Hatte das selbe Problem. Hab dann einfach zur checkVerticalCollision-Methode in der Tile-Klasse folgendes hinzugefügt:
if (rbot.intersects(r) && type == 8)
{
robot.setJumped(false);
robot.setSpeedY(0);
}
Hallo,
ich hatte das selbe Problem. Ich hatte aus versehen in der StartingClass.start() zwei robot erstellt. Nachdem ich ein robot = new Robot(); gelöscht hatte liefs einwandfrei.
Dere
Hey,
erstmal ein Lob an dein Tutorial, es ist echt klasse erklärt alles! Man sieht, wie sehr Dir das ganze am Herzen liegt, weiter so! 😉
Was hat dich dazu bewogen die Rechtecke des Roboters als statisch zu deklarieren?
Hallo
Danke dir
Die Rechtecke sind immer gleich groß und ändern sich nicht, also reicht statisch aus. Meines Wissens jedenfalls.
Grüße