====== 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 g) ===== Fortgeschrittene Schüler/-innen werden die graphischen Objekte sicher zu Gruppen kombinieren, z.B. Group enemies = new Group<>(); Group stars = new Group<>(); // usw. ... Die Methode ''a.getCollidingShapes(Group 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.