Einführung in die Problematik:
Ich hab hier ein kleines Problem und zwar will ich zu Testzwecken ein isometrisches Spielfeld (Map) programmieren, welche aus einzelnen Tiles zusammengesetzt ist. Um genau zu sein ist es eine Rautenkarte (so wie hier: http://www.neoji.co.za/neo/gg/nxiso/occlude.jpg ). Die einzelnen Tiles bzw. die komplette Map darstellen zu lassen war für mich kein Problem. Jetzt wollte ich jedoch nicht nur einfach die Tiles darstellen, sondern auch (eben zu Testzwecken) versuchen mit diesen zu interagieren. Da ich sechs Grafiken dafür erstellt habe (Gras, Sand, Meer, Gras-Sand, Sand-Meer, Haus) möchte ich, dass man per Tastendruck der Maustaste auf ein Tile dieses eine Tile verändert und zwar soll es "weiterschalten" (Gras > Sand, Sand > Meer, Meer > Gras-Sand, Gras-Sand > Sand-Meer, Sand-Meer > Haus). Natürlich hat man bei unterschiedlich hohen Tiles das Problem, dass ein vorderes Tile (z.B. mit einem Hochhaus) die hinteren Tiles etwas überdeckt. Jetzt möchte ich nicht immer nur, dass man mit der Maus auf die Standardgröße des Tiles klicken darf, so dass es "weiterschaltet", sondern dass man eben höhere Tiles auch oben anklicken kann, so dass die gleiche Interaktion möglich ist. Im Falle eines Hochhauses, welches eben die zwei hinteren Tiles ein wenig verdeckt, möchte ich auch oben auf das Dach klicken können und dann soll das Tile "weiterschalten". Die Umsetzung dieser Interaktion bereitet mir leider etwas Schwierigkeiten.
Programmierung:
Ein Tile ist bei mir eine eigene Klasse, welche von JLabel erbt und die Grafikdatei (*.png-Dateien) aufnimmt. Zusätzlich werden noch weitere Informationen wie die Höhe, Breite, Name, usw. gespeichert. In meinem Fall sind die Standardtiles bzw. deren Grafiken auch immer halb so hoch (30 px) wie breit (60 px), außer eben mein Haus (60x60 px). In Form einer Rautenkarte (Tile[x][y]) habe ich einige Tiles nun in einem JFrame platziert, um genauer zu sein auf dessen Contentpane. Per MouseListener (welche ich bei den einzelnen Tiles angemeldet habe) und der Methode mousePressed() rufe ich immer nach einem Mausklick die x- und y-Koordinaten des Mauszeigers ab. Natürlich gibt es bei meinem Vorgehen noch ein kleines Problem und zwar werden die Grafiken logischerweise immer noch als normale (nicht isometrische) Rechtecke auf der Contentpane als JLabels mit ImageIcon platziert. Das bedeutet, sobald ich in einen transparenten Bereich eines Tiles klicke - aber eben immer noch in seinem Bildbereich / Rechteck bin - klicke ich eigentlich zwar immer noch auf das vordere Tile, aber auf dem Bildschirm hat der Benutzer das Gefühl und wohl auch Vorhaben eigentlich auf das verdeckte Tile zu klicken. Um das zu verhindern wollte ich nun die Farbe bzw. eigentlich eher Transparenz des angeklickten Pixels abfragen. Wäre dieser Pixel nämlich transparent, dann wüsste ich natürlich, dass man im Grunde das dahinterliegende Tile anklicken möchte und könnte das dann alles so programmieren. Ich habe mich zwar im Forum schon umgesehen und einiges zum Abfragen der Farbe eines Pixels gelesen, bloß da war eigentlich immer nur die Rede von RGB-Werten. Wie genau läuft das mit der Transparenz ab? Brauch ich da nicht noch den Alphawert (RGBA)? Wie kann ich diesen Wert genau abfragen? Wie bekomm ich dieses Problem oder allgemein diese Funktionalität am besten hin?
Ich wäre für Hilfe sehr, sehr, sehr dankbar.
Ich hab hier ein kleines Problem und zwar will ich zu Testzwecken ein isometrisches Spielfeld (Map) programmieren, welche aus einzelnen Tiles zusammengesetzt ist. Um genau zu sein ist es eine Rautenkarte (so wie hier: http://www.neoji.co.za/neo/gg/nxiso/occlude.jpg ). Die einzelnen Tiles bzw. die komplette Map darstellen zu lassen war für mich kein Problem. Jetzt wollte ich jedoch nicht nur einfach die Tiles darstellen, sondern auch (eben zu Testzwecken) versuchen mit diesen zu interagieren. Da ich sechs Grafiken dafür erstellt habe (Gras, Sand, Meer, Gras-Sand, Sand-Meer, Haus) möchte ich, dass man per Tastendruck der Maustaste auf ein Tile dieses eine Tile verändert und zwar soll es "weiterschalten" (Gras > Sand, Sand > Meer, Meer > Gras-Sand, Gras-Sand > Sand-Meer, Sand-Meer > Haus). Natürlich hat man bei unterschiedlich hohen Tiles das Problem, dass ein vorderes Tile (z.B. mit einem Hochhaus) die hinteren Tiles etwas überdeckt. Jetzt möchte ich nicht immer nur, dass man mit der Maus auf die Standardgröße des Tiles klicken darf, so dass es "weiterschaltet", sondern dass man eben höhere Tiles auch oben anklicken kann, so dass die gleiche Interaktion möglich ist. Im Falle eines Hochhauses, welches eben die zwei hinteren Tiles ein wenig verdeckt, möchte ich auch oben auf das Dach klicken können und dann soll das Tile "weiterschalten". Die Umsetzung dieser Interaktion bereitet mir leider etwas Schwierigkeiten.
Programmierung:
Ein Tile ist bei mir eine eigene Klasse, welche von JLabel erbt und die Grafikdatei (*.png-Dateien) aufnimmt. Zusätzlich werden noch weitere Informationen wie die Höhe, Breite, Name, usw. gespeichert. In meinem Fall sind die Standardtiles bzw. deren Grafiken auch immer halb so hoch (30 px) wie breit (60 px), außer eben mein Haus (60x60 px). In Form einer Rautenkarte (Tile[x][y]) habe ich einige Tiles nun in einem JFrame platziert, um genauer zu sein auf dessen Contentpane. Per MouseListener (welche ich bei den einzelnen Tiles angemeldet habe) und der Methode mousePressed() rufe ich immer nach einem Mausklick die x- und y-Koordinaten des Mauszeigers ab. Natürlich gibt es bei meinem Vorgehen noch ein kleines Problem und zwar werden die Grafiken logischerweise immer noch als normale (nicht isometrische) Rechtecke auf der Contentpane als JLabels mit ImageIcon platziert. Das bedeutet, sobald ich in einen transparenten Bereich eines Tiles klicke - aber eben immer noch in seinem Bildbereich / Rechteck bin - klicke ich eigentlich zwar immer noch auf das vordere Tile, aber auf dem Bildschirm hat der Benutzer das Gefühl und wohl auch Vorhaben eigentlich auf das verdeckte Tile zu klicken. Um das zu verhindern wollte ich nun die Farbe bzw. eigentlich eher Transparenz des angeklickten Pixels abfragen. Wäre dieser Pixel nämlich transparent, dann wüsste ich natürlich, dass man im Grunde das dahinterliegende Tile anklicken möchte und könnte das dann alles so programmieren. Ich habe mich zwar im Forum schon umgesehen und einiges zum Abfragen der Farbe eines Pixels gelesen, bloß da war eigentlich immer nur die Rede von RGB-Werten. Wie genau läuft das mit der Transparenz ab? Brauch ich da nicht noch den Alphawert (RGBA)? Wie kann ich diesen Wert genau abfragen? Wie bekomm ich dieses Problem oder allgemein diese Funktionalität am besten hin?
Ich wäre für Hilfe sehr, sehr, sehr dankbar.