Erstellen nicht rechteckiger Hotspots und Erkennen von Klicks
7
Sagen Sie für ein Spiel mit unregelmäßigen Hotspots (sagen wir Risiko oder ein Strategiespiel wie Paradox 'Hearts of Iron oder Crusader Kings), wie geht es Ihnen?
Definieren Sie einen nicht rechteckigen Hotspot mit unregelmäßiger Form (ähnlich wie ein Gebiet auf einer Karte?) Im Code?
Mit welchem Tool können Sie den Hotspot ausfindig machen und in Ihr Spiel importieren?
Was ist der Algorithmus, um zu erkennen, ob jemand in einen solchen Hotspot geklickt hat?
Neben dem Vektor / Polygon-Ansatz besteht eine andere Möglichkeit darin, eine Bitmap zu verwenden.
Wenn jede "Farbe" in der Bitmap ein Gebiet darstellt (Frankreich, Belgien usw.), müssen Sie lediglich herausfinden, auf welches Pixel in der Bitmap geklickt wurde, die Farbe nachschlagen und feststellen, ob diese Farbe das interessierende Gebiet darstellt. Sie können sogar überlappende Gebiete mit bestimmten Farben darstellen oder Ihre Farben als Bitmaske von Gebieten behandeln.
Lassen Sie Ihre Künstler / Inhaltsproduzenten die Bitmap in Bezug auf Tools in einem beliebigen Pixelbearbeitungswerkzeug erstellen. Wenn Sie beispielsweise Photoshop oder Gimp verwenden, können Sie verschiedene Gebiete (Frankreich, Belgien usw.) entweder als benannte Ebenen oder als eine Ebene darstellen, wobei die Gebiete jedoch anhand von Farben unterschieden werden. Sie würden dann ein Tool schreiben, um das Bild / die Ebenen in ein Format zu konvertieren, das für spielinterne Zwecke geeignet ist.
Das spielinterne Format wird sehr wahrscheinlich pro Zeile komprimiert (siehe: http://en.wikipedia.org/wiki/Run-length_encoding ). Auf diese Weise sollten Sie in der Lage sein, sehr gute Komprimierungsverhältnisse zu erzielen, da benachbarte Pixel in Zeilen sehr oft zum selben Gebiet gehören. Der Algorithmus wird dann für die aktuelle y-Koordinate der Maus diese Zeile durchlaufen und herausfinden, zu welchem Lauf er gehört und daher zu welchem entsprechenden Gebiet.
Wollte etwas Ähnliches schreiben, das ist viel einfacher als mit Polygonen zu spielen.
aaaaaaaaaaaa
Ja, Sie erhalten auch pixelgenaue Präzision. Das Spielen mit Polygonen ist nur ein Chaos.
Michael Coleman
2
+1 (weil es eine einfache und schnelle Lösung ist), obwohl es mehr Daten verwendet und möglicherweise nicht so auflösungsunabhängig ist wie der Polygonansatz.
Sie können ein Vektorprogramm wie inkscape verwenden, um die Maske zu erstellen. Dies gibt Ihnen den Vorteil, dass Sie die Karte aus / mit Polygonen und Ebenen erstellen / bearbeiten können und gleichzeitig einen einfachen Export nach z. B. * .bmp
Exilyth
7
Sie müssen die Hotspots als eine Reihe von Polygonen definieren, die Ihr Bild überlagern. Wenn ein Benutzer auf die Karte klickt, durchsuchen Sie die Liste der Polygone (anklickbare Hotspots) und sehen Sie, in welchem (falls vorhanden) sich der Klickpunkt befindet.
Sie können auch untersuchen, wie Imagemaps in HTML erstellt werden. Nicht, dass Sie mit HTML arbeiten würden, aber im Grunde sind sie genau das, was Sie implementieren möchten. Sie ermöglichen das Definieren von Hotspots als Rechtecke, Kreise und Polygone (was Sie möchten).
Für diese Art von Dingen verwenden wir ein Bild, das als Maske verwendet wird, mit transparenten / undurchsichtigen oder schwarz / weißen Pixeln. Die Masken werden nicht gezeichnet, sondern konzeptionell über dem Kartenbereich "platziert", den sie abdecken.
Wenn Sie einen Klick erhalten, überprüfen Sie zuerst den Begrenzungsrahmen des Bildes. Wenn es draußen ist, hat der Spieler nicht auf die Region geklickt. Wenn es drin ist, überprüfen Sie das Pixel. Wenn es transparent / schwarz ist, hat der Player nicht auf die Region geklickt. Ansonsten tat er es.
Wenn die Speichernutzung ein ernstes Problem darstellt, können Sie Bilder in halber Größe verwenden und den entsprechenden Bildschirm auf die Bildkoordinatenkonvertierung anwenden. Sie erhalten keine pixelgenaue Erkennung, benötigen sie in diesem Fall jedoch wahrscheinlich nicht.
Wenn Sie transparent / undurchsichtig werden, speichern Sie die Masken entweder als PNG (oder ein anderes verlustfreies Komprimierungsschema) oder verwenden Sie einen hohen Schwellenwert (Alpha> 128 anstelle von Alpha> 0). Andernfalls können JPEG-Artefakte dazu führen, dass einige der transparenten Pixel nicht so transparent erscheinen (z. B. Alpha = 1 oder 2 anstelle von Alpha = 0).
-1, dies ist nur eine wesentlich verschwenderischere Version der Methode von jpaver.
1
Kommt auf die Details an. Normalerweise verwenden wir die Schaltflächenbilder als Masken, sodass diese Methode weniger Speicher benötigt als die Methode von jpaver.
Sie müssen die Hotspots als eine Reihe von Polygonen definieren, die Ihr Bild überlagern. Wenn ein Benutzer auf die Karte klickt, durchsuchen Sie die Liste der Polygone (anklickbare Hotspots) und sehen Sie, in welchem (falls vorhanden) sich der Klickpunkt befindet.
Sie können auch untersuchen, wie Imagemaps in HTML erstellt werden. Nicht, dass Sie mit HTML arbeiten würden, aber im Grunde sind sie genau das, was Sie implementieren möchten. Sie ermöglichen das Definieren von Hotspots als Rechtecke, Kreise und Polygone (was Sie möchten).
Hier ist eine Webseite, die HTML-Imagemaps beschreibt, die Ihnen einige Ideen geben könnten: http://www.javascriptkit.com/howto/imagemap.shtml
Hier ist ein Wikipedia-Artikel über Algorithmen, um festzustellen, ob sich ein Punkt in einem Polygon befindet: http://en.wikipedia.org/wiki/Point_in_polygon
quelle
Sie können eine beliebige Form als eine Reihe von Punkten definieren, die in Liniensegmente umgewandelt werden.
Der Kollisionstest für "Bin ich in dieser beliebigen Form" ergibt sich aus meiner Antwort hier: Wie überprüfe ich in Cocos2D, ob Kollisionen mit einer beliebigen vom Benutzer gezeichneten Form vorliegen?
quelle
Für diese Art von Dingen verwenden wir ein Bild, das als Maske verwendet wird, mit transparenten / undurchsichtigen oder schwarz / weißen Pixeln. Die Masken werden nicht gezeichnet, sondern konzeptionell über dem Kartenbereich "platziert", den sie abdecken.
Wenn Sie einen Klick erhalten, überprüfen Sie zuerst den Begrenzungsrahmen des Bildes. Wenn es draußen ist, hat der Spieler nicht auf die Region geklickt. Wenn es drin ist, überprüfen Sie das Pixel. Wenn es transparent / schwarz ist, hat der Player nicht auf die Region geklickt. Ansonsten tat er es.
Wenn die Speichernutzung ein ernstes Problem darstellt, können Sie Bilder in halber Größe verwenden und den entsprechenden Bildschirm auf die Bildkoordinatenkonvertierung anwenden. Sie erhalten keine pixelgenaue Erkennung, benötigen sie in diesem Fall jedoch wahrscheinlich nicht.
Wenn Sie transparent / undurchsichtig werden, speichern Sie die Masken entweder als PNG (oder ein anderes verlustfreies Komprimierungsschema) oder verwenden Sie einen hohen Schwellenwert (Alpha> 128 anstelle von Alpha> 0). Andernfalls können JPEG-Artefakte dazu führen, dass einige der transparenten Pixel nicht so transparent erscheinen (z. B. Alpha = 1 oder 2 anstelle von Alpha = 0).
quelle