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.
collidesWithFillColor
Auch diese Methode ist für Anfänger gedacht, sie ist aber deutlich flexibler als collidesWithAnyShape. o.collidesWithFillColor(Color.blue) gibt genau dann true zurück, wenn das Objekt o mit einem Objekt kollidiert, das Unterklasse von FilledShape ist und die Füllfarbe Color.blue (oder 0x0000ff) besitzt.
getFirstCollidingShape
Auch diese Methode ist für Anfänger gedacht. Im Vergleich zu den zwei vorhergehenden Methoden gibt o.getFirstCollidingShape eine Referenz auf das kollidierende Objekt zurück, sodass dieses beispielsweise mit der Methode destroy zerstört werden kann.
getFirstCollidingSprite(int imageIndex)
Oft sind die Figuren eines Computerspiels Sprites, die aus der selben SpriteLibrary stammen. In diesem Fall kann die Kollisionsprüfung mittels o.getFirstCollidingSprite(int imageIndex) auf die Sprites mit dem übergebenen Bildindex eingeschränkt werden. Es wird das erste passende kollidierende Sprite zurückgeliefert, ohne dass nach weiteren kollidierenden Sprites gesucht wird. Da die Methode i.d.R. innerhalb einer act-Methode 30-mal je Sekunde aufgerufen wird, ist dies bei Zerstörung der kollidierenden Objekt aber ausreichend, um dem Spieler die Illusion zu geben, dass alle in Frage kommenden Kollisionen entdeckt werden.
