Java Kollisionserkennung zwischen zwei Shape-Objekte?
Ich würde gerne wissen, der beste Weg, zu sagen, wenn ein Shape-Objekt überschneidet einer anderen Form.
Derzeit habe ich die Kollisionserkennung in meinem Spiel aussortiert solange es mit einer Form sich kreuzender ein Rechteck oder Umgekehrt. Das problem das ich habe ist, dass der intersects () - Methode der Form-Klasse kann nur ein Rechteck oder einen Punkt als parameter, nicht in einer anderen Form. Gibt es eine effiziente Möglichkeit, um zu testen, ob zwei Shape-Objekte sind überschneidungen in irgendeiner Weise?
Eine Möglichkeit, die ich versuchte, war mit einer for-Schleife zu generieren, der einen Bereich von Punkten zu testen, wenn Sie waren in die Form, und dann bauen ein array von Point-Objekten zu senden, um die andere Form zu testen, aber dies deutlich ließ meine framerate wegen all der unnötigen Vergleiche.
Ich schaute und schaute für etwas ähnliches hier, aber finde nicht wirklich etwas. Sorry im Voraus, wenn dies ist eine Wiederholung.
Nein, die bounding-box wird nicht funktionieren. Es muss der tatsächliche Umfang der Form. Ich habe versucht mit der getBounds () - Methode, aber wenn Sie versuchen, um deinen Charakter zu bewegen schräg an einer Wand, die Sie erhalten blieb, obwohl der sprite ist nicht, es zu schlagen.
InformationsquelleAutor Monkeybro10 | 2013-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht getestet, aber warum nicht:
Bereich implementiert Form, fügt aber hinzu, einige potenziell nützliche Methoden
Gerne helfen 🙂
Bedeutet das nicht, dass Sie eine Menge Müll?
Ich bezweifle, dass ein Gebiet-Instanz verwendet sehr viel heap-Speicher, und da der "intersect" - Betrieb mutiert die Fläche, es würde nicht viel nutzen und versuchen, wieder verwenden. So oder so, JVM-GC-Strategien sind darauf ausgelegt, kurzlebige Objekte besser als langlebige Objekte: programmers.stackexchange.com/questions/149563/...
Ich dachte nur, wenn Sie diese Methode bei jedem tick. für mehrere Objekte, könnte dies zu einigen Problemen führen.
InformationsquelleAutor user2221343
Können Sie auch die Grenzen der Form selbst und vergleichen Sie dann die Grenzen:
Dies ist ein bisschen schöner in den Augen.
intersect
Methode nicht mutieren die Form. Auch der Vertrag für dieseintersect
gibt an, dass die Genauigkeit kann reduziert werden, zu Gunsten der Leistung: docs.oracle.com/javase/7/docs/api/java/awt/geom/...InformationsquelleAutor TastyLemons
Obwohl user2221343 schon beantwortet Monkeybro10 Frage, ich dachte, es könnte hilfreich sein, in einigen Fällen, um zu wissen, dass die Kontur einer Form eine Rolle spielen könnten, wenn Sie seine beschriebenen Technik:
Zum Beispiel, wenn Sie zeichnen Sie zwei Polygone, die Kollision von Ihnen wird nicht erkannt werden, wenn es geschieht, nur auf die genauen Umrisse der Polygone. Nur, wenn die Bereiche, die enthalten sind innerhalb der Polygone Konturen überlappen, wird die Kollision erkannt wird.
Wenn Sie füllen zwei Polygone, aber nicht ziehen Sie die Kollision erkannt wird, auch auf die Gliederung des sichtbaren Bereichs.
Ich schrieb ein kleines Beispiel, um zu zeigen, was ich meine. Entweder kommentieren Sie das draw oder fill-Befehl, und steigen Sie das zweite polygon vertikal um einen pixel, indem Sie die Kommentarzeichen der angegebenen Zeile. Führen Sie den code und beobachten Sie das Ergebnis in das JFrame. Wenn das zweite Polygon ist gestiegen, und die beiden Polygone sind nur sichtbar, indem Sie die "fill" - Befehl, Sie schneiden sich mit Ihren Konturen und Kollision erkannt wird. Wenn das zweite polygon ist noch nicht aufgegangen, und beide Polygone sichtbar sind, indem Sie die "draw" - Befehl, Sie schneiden sich mit Ihren Konturen, aber die Kollision nicht erkannt wird:
InformationsquelleAutor Done123
Wenn Sie denken, der Bereich überschneiden, ist zu teuer, könnte man zuerst einen bounds-check:
shapeA.getBounds().intersects(shapeB.getBounds())
Wenn das geht, dann tun Sie das Gebiet intersect prüfen.
InformationsquelleAutor Lance Wentz