Selektieren von Grafik
-
Hallo zusammen,
ich habe eine "Spiel"-Karte auf der man rumscrollen kann, auf der Items rumliegen etc. Das ganze wird über eine Canvas dargestellt.
Ich würde gerne wissen ob man irgendwie herausfinden kann, wenn man mit der Maus klickt, welche Grafik angeklickt wurde. bzw. wenn das so einfach nicht geht, was die Vorbedingungen wären um die zu realisieren.
Vielen Dank
-
Du hast du die koordinaten der grafiken
-
Hi,
ja das war natürlich das erste an das ich auch gedacht habe. Das Problem aber ist, dass es sich um eine Isometrische Engine handelt und das mehrere Objekte über-, bzw. untereinander liegen können.(Tisch, Tischdecke, Teller, Apfel)
Mit anderen Worten: Die Tischdecke von einem gedecktem Tisch zu ziehen ist nicht möglich wenn ich nur eine Koordinate habe. Es würde automatisch das oberste Objekt selektiert.
Dazu kommt noch, dass in der Iso-Perspektive die Objekte nicht immer an der Stelle gezeichent werden an der sie verankert sind.Ich habe die Klasse Component entdeckt. Bin mir aber nicht sicher ob man mit der irgendwas tricksen könnte?
Bin für jede Hilfe dankbar!
Danke
-
Hallo noobie,
ist zwar schon etwas älter der Post, aber vielleicht hilft es ja trotzdem noch jemandem.
Ich hatte vor etwas längerer Zeit bei einer Karte für ein Risiko-Spiel dasselbe Problem. Ich habe das mit folgenden Zeilen Code gelöst.
/** * Es wird überprüft ob sich der angegeben Punkt in dem Rechteck Bounds befindet, * wenn dies der Fall ist wird weiterhin überprüft ob der Punkt im Image_1 einen * Alpha-Wert > 0 hat. * @param x x-Koordinate des zu überprüfenden Punktes * @param y y-Koordinate des zu überprüfenden Punktes * @return true - wenn sich der Punkt im Land befindet<br/> * false - wenn sich der Punkt auuserhalb des Landes befindet */ public boolean MouseOver(int x, int y){ boolean over = false; /** Zuerst überprüfen ob sich der Punkt in dem Einzugsbereich des Landes befindet. */ if (getBounds().contains(x,y) == true) { /** Die Farbwerte des Pixels an dem Punkt hohlen und zerlegen. */ int pixel = Bilder[0].getRGB(x-Bounds.x, y - Bounds.y); int alpha = (pixel >> 24) & 0xff; /** Wenn der Alpha Wert != 0 ist befindet sich an diesem Punkt Land */ if (alpha !=0) over = true; } return over; }
Die Idee dahinter ist recht simpel ich habe in dem Bild-Material ein Farbe für den Hintergrund, die im eigenlichem Bild selbst nicht vorhanden ist.
Nun prüfe ich zuerst ob sich die Mauskoordinaten überhaupt im Bildbereich befindet. wenn das der Fall ist prüfe ich diesen Punkt noch auf meine festgelegte Farbe. So lässt sich auf dem Pixel genau feststellen ob die Maus über einem Objekt ist oder nicht.
Jetzt kommt bei dir noch erschwerend hinzu das sich Objekte überlagern können. Dazu fallen mir im Moment 2 Lösungswege ein.
1. Du gibst deinen Objekten eine Z-Wert mit, soll heissen das Objekt mit dem niedrigsten (oder höchsten) Wert wird selektiert.
2. Du hohlst dir den kompletten Inhalt des Fenster und vergleichst den Farbwert an der Mausposition mit den in Frage kommenden Bilder an der selben stelle.
MfG
DarkMight1
-
Ja, ist schon ein bisschen länger her aber bisher hatte ich keine Zeit daran weiter zu schrauben, deshalb kommt das gar nicht so spät
Das was Du gerade erklärt hast erinnert mich an die Art der Bodenplatten-Selektion die bei ISO-Engines benutzt wird. -> http://www.gamedev.net/reference/articles/article747.aspIch möchte mich nochmals bedanken. Jetzt habe ich einen Ansatz mit dem ich sicher auch weiter komme!
Danke,
noobie