Wie erkennt man Kollisionen zwischen Sprite und einer vom Benutzer generierten Form?

9

So erkennen Sie eine Kollision zwischen einem Sprite und einer vom Benutzer generierten Form.

Zum Beispiel. Auf dem Bildschirm befinden sich einige Objekte. Der Benutzer nimmt seinen Finger und zeichnet eine Kreisform um ein Objekt (Die Auswahlregel lautet, einen Kreis um das Sprite zu malen, die Malformen können jedoch unterschiedlich sein). Ich muss erkennen, welches Objekt ausgewählt wurde, welches genau wie:

(Demobilder): ursprünglich veröffentlicht als http://i52.tinypic.com/28h0t1g.png

Huwell
quelle
Können Sie erklären, warum in Ihrem letzten Beispiel Blau und nicht Rot ausgewählt ist? Können Sie auch klären, ob die Linie das Sprite tatsächlich berühren muss? Das dritte Beispiel berührt das rote Kästchen nicht, wird jedoch als ausgewählt angegeben. Das 5. Beispiel ist sehr ähnlich, aber nicht ausgewählt. Was ist der Unterschied, den Sie zwischen # 3 und # 5 suchen?
Romen

Antworten:

2

Wenn die Form hauptsächlich mit Liniensegmenten des Benutzers (oder Bezier-Kurven mit Kontrollpunkten) gezeichnet wird, können Sie einen ziemlich weit verbreiteten Algorithmus implementieren, der als Separating-Axis-Theorem bekannt ist . Einfach ausgedrückt: Wenn es eine Achse (Einheitsvektor, der eine Richtung darstellt) gibt, auf der sich die Formen nicht überlappen (ihre projizierten Werte führen nicht zu einem positiven Unterschied), überlappen sich die Objekte nicht. Ich habe dies in der Vergangenheit verwendet und es hat wie ein Zauber funktioniert.

Grimless
quelle
1

Wenn die Form wie in Crayon Physics von Hand gezeichnet ist , können Sie eine Reihe von geraden Linien halten und Kollisionen mit jeder von ihnen überprüfen. Trotz gerader Linien können Sie Bezier-Kurven oder ähnliches verwenden.

oben rechts
quelle
0
  • Erstellen Sie einen Puffer mit der gleichen Größe wie der Bildschirm (oder die Oberfläche, auf der sich Ihre Formen befinden). An jeder Position enthält es Boolesche Werte, ob Sprite vorhanden ist. Überprüfen Sie dann alle "Pixel" der Benutzerform, ob sich an ihrer Position das Sprite befindet (indem Sie den Wert dieses Booleschen Werts überprüfen). Alternativ können Sie dort weitere Sprites erstellen, indem Sie deren ID anstelle von Booleschen Werten speichern. Dies war jedoch bei 1 Sprite der Fall.
  • Wenn eine vom Benutzer generierte Form durch eine Folge von Linien dargestellt werden kann, können Sie überprüfen, ob jede dieser Linien das Sprite kreuzt. Da Sprite eine rechteckige Form hat und die Benutzerform eine Linie ist, suchen Sie einfach nach "Schnittpunkt des Linienrechtecks" ... (Algorithmus zum Trennen von Achsen auf eine Weise)

Ansätze hängen davon ab, welche Datenstrukturen Sie auswählen, ob es sich um Bitmaps oder Vektoren handelt.

Der erste Ansatz kann beliebig komplexe Formen verarbeiten, ist einfach zu implementieren, benötigt jedoch mehr Speicher. Tatsächlich können Sie den Speicheraufwand durch Komprimierung reduzieren und durch Verwendung von hierarchischen Datenstrukturen (Oktrees) beschleunigen ...

Der zweite Ansatz ist nicht so einfach zu implementieren, verbraucht jedoch mehr Rechenleistung.

In jedem Fall messen, ob es darauf ankommt. Ich würde versuchen, zuerst eine zu machen, weil es einfacher zu implementieren ist. Viel Glück. :) :)

user712092
quelle