Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Kollisionserkennung
Um zu erkennen, ob ein graphisches Objekt A mit einem anderen graphischen Objekt einer bestimmten Art oder aus einer vorgegebenen Liste kollidiert, müssen letzere Objekte in einem Array, einer Liste, einer Group oder ähnlichem gespeichert sein und ein Attribut von A auf dieses Array/diese Liste/diese Group zeigen. Da diese Form der Aggregation oft erst spät im Unterricht thematisiert wird, aber trotzdem wünschenswert ist, schon früh ansprechende Spiele oder Beispielprogramme zu erstellen, unterstützt die Online-IDE verschiedene Konzepte der Kollisionserkennung, die im Folgenden dargestellt werden.
collidesWith(Shape otherShape)
Falls Referenzen a, b der Objekte zur Verfügung stehen, deren Kollision überprüft werden soll, kann einfach a.collidesWith(b) ausgewertet werden.
Tipp:
a und/oder b können auch Referenzen auf Group-Objekte sein, die wiederum viele andere Objekte enthalten.
T[] getCollidingShapes(Group<T> g)
Fortgeschrittene Schüler/-innen werden die graphischen Objekte sicher zu Gruppen kombinieren, z.B.
Group<Sprite> enemies = new Group<>(); Group<Circle> stars = new Group<>(); // usw. ...
Die Methode a.getCollidingShapes(Group<T> g) prüft die Kollision von a mit jedem einzelnen graphischen Objekt von g und gibt ein Array aller Objekte aus g zurück, die mit a kollidieren.
Tipp:
Ist ein Objekt o in einer Group g enthalten und wird o.destroy aufgerufen, so meldet o das vor seinem „Ableben“ an g, was zur Folge hat, dass o automatisch aus g entfernt wird. Das funktioniert aber nur mit Group, nicht bspw. mit ArrayList.
collidesWithAnyShape()
Diese Methode ist für Anfänger gedacht, da sie keine Referenzen auf die Objekte benötigt, mit denen einen Kollision geprüft werden soll. Sie hat den großen Nachteil, dass keine Einschränkung auf bestimmte Objekttypen gemacht werden kann, z.B. „Werte nur die Kollision mit Enemies aus, nicht mit anderen Objekten“. Damit Anfänger auch letzteres zustandebringen können, gibt es nachfolgend mehrere spezifischere Varianten dieser Methode.
