Nehmen wir an, ich benutze diesen Charakter.
(Quelle: iconbug.com )
Wie würden Sie die Kollisionserkennung dafür implementieren? Die Verwendung eines Begrenzungsrahmens scheint keine gute Annäherung zu sein, da die Form des Vogels bei weitem nicht in der Nähe eines Quadrats liegt.
Ich dachte daran, eine Art Quad-Tree-Datenstruktur innerhalb des Objekts zu haben, die Teile des Bildes darstellt. Jedes Blatt kann entweder false
(falls es den weißen / transparenten Raum außerhalb des Vogels bedeckt) oder seintrue
(falls es einen Bereich des Vogels darstellt, dh Schnabel, Auge usw.) sein. Dann testen Sie irgendwie das einzige Hindernis in der Szene auf Kollision mit dem Vogel.
Aber meine Probleme in meinem Ansatz sind:
- Ich weiß nicht, wie ich den Quad-Baum initialisieren soll.
- Sobald der Quad-Baum initialisiert ist, bin ich mir nicht sicher, wie ich ihn durchlaufen und verwenden soll, wenn sich das Hindernis innerhalb der Koordinaten des Bildes befindet.
Wie würden Sie die Kollisionserkennung mit nicht quadratischen Zeichen durchführen?
LE: Der andere Ansatz, den ich gesehen habe, war die Verwendung mehrerer Begrenzungsrahmen. Zum Beispiel hätte ich einen oder mehrere Begrenzungsrahmen für den Schnabel, dann einige für die Haare oder den Schwanz. Aber es kann langweilig werden. Wenn dies in meinem Fall ein gültiger Ansatz ist, wie würde ich diese Begrenzungsrahmen generieren? Ich bezweifle, dass ich sie in meinem Programm fest codieren muss.
LE2: Ich kümmere mich um ziemlich genaue Kollisionen. Ich kann mir nicht vorstellen, wie ein einzelner Begrenzungsrahmen oder Kreis diese Form zumindest annähernd annähern kann, daher funktioniert dieser Ansatz nicht.
quelle
Antworten:
Kreiscollider. Gut genug dafür würde ich sagen, es sei denn, Sie tun etwas Besonderes, wenn bestimmte Teile von der Physik betroffen sind oder wenn die Kollision unnatürlich aussieht, und selbst wenn Sie sie in mehrere Teile aufteilen müssen, muss ich Ihnen eines sagen:
Überkomplizieren Sie es nicht.
Sie benötigen hierfür keine vollständige Quad-Baum-Struktur. Haben Sie einfach mehrere Kästchen oder Kreise in einer geraden Anordnung und schneiden Sie sie dann mit allen. Dies kann unmöglich leistungskritisch genug sein und Sie werden nicht so viel von der Verwendung eines Quad-Baums profitieren.
quelle
Ein zweistufiger Überprüfungsprozess
Im ersten Schritt aktivieren Sie den Begrenzungsrahmen Wenn dort keine Kollision vorliegt, ist der Test beendet. Bei einer Kollision wechseln Sie zum zweiten Durchgang
Wenn Sie beim zweiten Durchgang mehr Präzision und eine echte pixelgenaue Lösung wünschen, können Sie genau das tun, einen pixelgenauen Prüfdurchgang
Da es sich bei Ihrem Bild um ein PNG (oder ein anderes Dateiformat, das einen Alphakanal enthält) handelt, ist dies recht einfach
Wenn Sie sich den Alpha-Kanal Ihrer Bilder ansehen, können Sie sehen, dass er bereits alle Informationen enthält, die Sie für eine pixelgenaue Kollision benötigen
Pixel-perfekte Kollisionen sind normalerweise teuer. Wenn Sie also zunächst eine grobe Schätzung mit einem Begrenzungsrahmen oder einer detaillierteren Kollisionszahl (wie von Anko vorgeschlagen) vornehmen, können Sie wertvolle Zeit sparen
Der "feinere" detaillierte Kollisionsbegrenzungsrahmen, den Anko vorschlug:
PS: Wenn Ihr Bild einen Heiligenschein, einen Effekt oder einen anderen Nicht-0-Alphakanal aufweist, mit dem Sie nicht kollidieren möchten, kann der Algorithmusschwellenwert leicht angepasst werden, um dies zu berücksichtigen
quelle
Ich würde einen Kreis für den Körper und ein einzelnes Rechteck für den Schnabel verwenden, aber das ist nur meine Meinung. Eine Überkomplizierung Ihrer Kollisionsgeometrie kann Ihre App jedoch verlangsamen. Sie verdoppeln praktisch (oder mehr) die Anzahl der Zeichen auf dem Bildschirm.
quelle
Vielleicht könnten Sie eine Art wackeligen Polygon / Kanten-Collider verwenden.
Ich weiß nicht genau, wie das funktionieren würde, aber:
zwei Objekte: Objekt 1: der Vogel (o1), Objekt 2: das Ding, das den Vogel treffen könnte (o2)
1) Definieren Sie eine Begrenzungsform, die ein Polygon ist, das eng an das erste betreffende Objekt (o1) passt.
2) Holen Sie sich die Kanten von o1, o2, die möglicherweise kollidieren könnten, ohne dass sie möglicherweise kollidieren könnten, ohne dass o2 durch o1 geht oder umgekehrt.
Mit der Position und Größe der Form (o2) könnten Sie wahrscheinlich Kanten (von o1) isolieren, die möglicherweise nicht getroffen werden können, unabhängig davon, ob sie sich "hinter" einer anderen Kante (von o1) befinden, die näher an o2 liegt. Wenn Sie ein rechtwinkliges Dreieck hatten, dessen Hypotenuse nach oben und rechts zeigt, und ein Rechteck, das sich ihm gerade nähert (mit der langen Seite entlang der x-Achse), können Sie erkennen, welche Kanten weggelassen werden sollen, da beide Werte für Anfang und Ende y sind über oder unter dem Rechteck.
3) Stellen Sie fest, ob einer der Punkte an einer Kante von o2 mit einem Punkt an einer der Kanten von o1 übereinstimmt, die Sie in Schritt 2 ausgewählt haben.
Dieses Konzept funktioniert wahrscheinlich am besten für kollidierende Polygone (dh Dinge mit klaren Kanten), aber vielleicht können Sie einen Kreis als eine lange Kante behandeln (z. B. wenn o2 ein Kreis war).
quelle
Es macht keinen Sinn, das Rad neu zu erfinden. Holen Sie sich eine gute Gaming-API, um dies für Sie zu tun.
2D-Gaming-Bibliotheken / Frameworks / Engines für Android
quelle