Einzelne Pixel auf Transparenz überprüfen?

Status
Nicht offen für weitere Antworten.

House

Mitglied
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.
 

Quaxli

Top Contributor
Eine eigene Klasse, die von JLabel erbt. Da stellt's mir schon wieder die Fußnägel auf. :( Ich weiß nicht warum jeder, der ein Spiel programmiert für die einfachsten Dinge Swing-Komponenten und deren gesamten Overhead and Methoden und Feldern verwendet. ???:L
Soviel erstmal zum Nörgeln.... ;)

Was Dein Problem bezüglich der Transparenz betrifft, kannst Du das auf Pixelebene wie folgt rausbekommen.

Entweder legst Du Dir ein mit dem Integer-Wert, den Du über getRGB zurück bekommst ein Color-Objekt an, z. B. mit diesem Konstruktor

Color(int rgba, boolean hasalpha)
Creates an sRGB color with the specified combined RGBA value consisting of the alpha component in bits 24-31, the red component in bits 16-23, the green component in bits 8-15, and the blue component in bits 0-7

und fragst mit getAlpha() eben jenen Alphawert ab.
Oder Du gehst mit Bitverschiebung auf den Integer-Wert los und liest wie in obigen Konstruktor beschrieben die Bits 24-31 aus und ermittelst so den Alpha-Wert.


Zum Them isometrische Maps kann ich Dir das Buch Killer Game Programming empfehlen. Hier seien Dir auf jeden Fall mal die Kapitel 11 (Sprites) und 13 (isometric tile map) ans Herz gelegt. Das Kapitel 13 habe ich selbst bisher nur überflogen, finde das Buch aber insgesamt empfehlenswert und die Teile, die ich von Kapitel 13 bisher gelesen habe ganz schlüssig.

Du könnstest das Ding aber auch gut von Anfang an lesen und vielleicht das Erben von JLabel weglassen, dann könnte ich heute nacht gut schlafen ;) :wink: :wink:
 

Quaxli

Top Contributor
Nachsatz: Hier ist noch ein anderer Link für Killer Game Programming dort kannst Du auch Teile des Buchs herunterladen.

Und hier noch eine Methode zum Bit-Shifting, die ich mir mal gebaut habe. In dem Fall wird aber auf "opaque" geprüft, also
auf das genaue Gegenteil zur Transparenz.

Code:
  protected boolean isOpaque(int rgb) {

    int alpha = (rgb >> 24) & 0xff;  
    //red   = (rgb >> 16) & 0xff;  
    //green = (rgb >>  8) & 0xff;  
    //blue  = (rgb ) & 0xff;  
    
    if(alpha==0){
      return false;
    }

    return true;
    
  }
 

House

Mitglied
Quaxli hat gesagt.:
Eine eigene Klasse, die von JLabel erbt. Da stellt's mir schon wieder die Fußnägel auf. :( Ich weiß nicht warum jeder, der ein Spiel programmiert für die einfachsten Dinge Swing-Komponenten und deren gesamten Overhead and Methoden und Feldern verwendet. ???:L
Soviel erstmal zum Nörgeln.... ;)

Du darfst gerne weiter nörgeln. Ich bin immer noch ein Anfänger und von Kritik kann ich nur lernen. Von daher, falls es etwas zu kritisieren gibt, nur zu. Aber jetzt zu der Frage, welche du dir vielleicht stellst: Warum habe ich JLabel benutzt? Nun, zum einen eben weil ich noch recht unerfahren bin, zum anderen weil ich mich bisher fast nur mit den Standard AWT- und Swing-Komponenten befasst habe. Von Java 2D habe ich noch ein bisschen die Basics aufgeschnappt, aber nicht sehr viel. Ich bin natürlich vorerst auf Nr. Sicher gegangen, wobei ich es natürlich gerne deutlich besser machen würde (wobei mir hierzu eben aktuell das Wissen und die Erfahrung fehlt).

Quaxli hat gesagt.:
Zum Them isometrische Maps kann ich Dir das Buch Killer Game Programming empfehlen. Hier seien Dir auf jeden Fall mal die Kapitel 11 (Sprites) und 13 (isometric tile map) ans Herz gelegt. Das Kapitel 13 habe ich selbst bisher nur überflogen, finde das Buch aber insgesamt empfehlenswert und die Teile, die ich von Kapitel 13 bisher gelesen habe ganz schlüssig.

Du könnstest das Ding aber auch gut von Anfang an lesen und vielleicht das Erben von JLabel weglassen, dann könnte ich heute nacht gut schlafen ;) :wink: :wink:

Ich werde mir das Ganze mal genauer anschauen, von diesem Buch werde ich wohl noch viel lernen können. Danke für die Links und den Hinweis.



In den nächsten Tagen werde ich mich nochmal mit dem Problem beschäftigen und hoffe, dass ich dann die gewünschte Funktionalität hinbekomme. Aber schon mal danke für die Hilfe, hat mich gefreut.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
J JavaFX TabPane / Wie füge ich einzelne items ? AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
M Einzelne Ordner im JFileChooser ausgrauen? AWT, Swing, JavaFX & SWT 4
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
M Swing Einzelne Fenster schließen AWT, Swing, JavaFX & SWT 2
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
K Swing JTable Editierfunktion für einzelne Zellen ausschalten AWT, Swing, JavaFX & SWT 3
S Einzelne JComboBox in JTable austauschen AWT, Swing, JavaFX & SWT 4
F Einzelne TreeNode an einem JTree editierbar machen AWT, Swing, JavaFX & SWT 3
C JTree Einzelne Objekte färben AWT, Swing, JavaFX & SWT 4
C Spielfeld Gitter - Einzelne Zellen verändern AWT, Swing, JavaFX & SWT 18
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
B Swing Einzelne Zelle in JTable soll NICHT auswählbar sein AWT, Swing, JavaFX & SWT 9
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
A Swing JTree Editable einzelne Nodes editierbar machen! AWT, Swing, JavaFX & SWT 2
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
R JTable einzelne Zellen selektieren AWT, Swing, JavaFX & SWT 7
J JTable: Einzelne Zelle selektieren AWT, Swing, JavaFX & SWT 6
X Einzelne Border setzen AWT, Swing, JavaFX & SWT 2
J MVC- einzelne Sichten auf einer Hauptsicht anzeigen AWT, Swing, JavaFX & SWT 3
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
P JTextArea - einzelne Zeile löschen bzw einfügn AWT, Swing, JavaFX & SWT 2
G Einzelne Objekte neu zeichnen AWT, Swing, JavaFX & SWT 8
B einzelne Zellen scrollbar machen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 3
E JTable einzelne reihe editierbar machen AWT, Swing, JavaFX & SWT 2
I einzelne Zellen bei JTable markieren AWT, Swing, JavaFX & SWT 3
C JTable: Einzelne Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 2
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
N Swing GridBagLayout: Ein Pixel Versatz AWT, Swing, JavaFX & SWT 2
D Swing Farbe aus Pixel vom JFrame auslesen AWT, Swing, JavaFX & SWT 17
M Wie ermittele ich die Breite und Höhe meines Displays in Pixel AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2
S Pixel im *.Gif ändern AWT, Swing, JavaFX & SWT 2
C AWT: Pixel für Pixel Linien auf Panel zeichnen AWT, Swing, JavaFX & SWT 2
D Pixel in ein Array einlesen AWT, Swing, JavaFX & SWT 2
I JScrollPane, wenn JLabels x Pixel erreichen AWT, Swing, JavaFX & SWT 3
K Fontgröße in Pixel angeben AWT, Swing, JavaFX & SWT 5
G Pixel ablaufartig verändern AWT, Swing, JavaFX & SWT 5
R Pixel zeichnen AWT, Swing, JavaFX & SWT 9
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
B Bild(pixel) füllen AWT, Swing, JavaFX & SWT 6
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
B Länge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
G Buggeredimage & pixel HUE/RGB AWT, Swing, JavaFX & SWT 17
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
T Pixel OS abhängig AWT, Swing, JavaFX & SWT 3
T jedes Pixel aus dem Image (auf dem Panel) auslesen AWT, Swing, JavaFX & SWT 3
N Laenge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
M Farbe eines Pixel im Image ändern AWT, Swing, JavaFX & SWT 1
Luma Bild Pixel für Pixel auslesen? AWT, Swing, JavaFX & SWT 3
H Pixel zeichnen AWT, Swing, JavaFX & SWT 6
F Pixel Farbe auslesen AWT, Swing, JavaFX & SWT 3
C Image-Pixel manipulieren AWT, Swing, JavaFX & SWT 9
T Pixel nach Farbwert abfragen AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
B Bild bearbeiten mit Transparenz (spiegeln, Farben austauschen) AWT, Swing, JavaFX & SWT 8
S Images färben und transparenz ändern AWT, Swing, JavaFX & SWT 4
Luk10 Transparenz von ARGB ints AWT, Swing, JavaFX & SWT 5
C Java2D Transparenz geht bei einfärben verloren AWT, Swing, JavaFX & SWT 7
B Swing Cursor-Transparenz AWT, Swing, JavaFX & SWT 2
C 2D Simulation möglichst effizient (ggf. Transparenz) AWT, Swing, JavaFX & SWT 23
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
R Transparenz AWT, Swing, JavaFX & SWT 21
O Transparenz mit AWTUtilities aber nur das Fenster nicht die Buttons AWT, Swing, JavaFX & SWT 8
R Transparenz mit AWTUtilities AWT, Swing, JavaFX & SWT 6
J Swing Transparenz bei Swingelementen AWT, Swing, JavaFX & SWT 2
V [SWT] Shell transparenz AWT, Swing, JavaFX & SWT 3
T Pseudo-Transparenz für Applets -> Background grabben AWT, Swing, JavaFX & SWT 15
D Label und Transparenz . AWT, Swing, JavaFX & SWT 4
T Transparenz mit SWT AWT, Swing, JavaFX & SWT 7
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
P 2 Probleme mit Panel: index setzten und transparenz AWT, Swing, JavaFX & SWT 4
A Transparenz ? AWT, Swing, JavaFX & SWT 13
E transparenz (alpha) - komisches aussehen von textfeldern! AWT, Swing, JavaFX & SWT 2
L Transparenz Problem mit verschiebung AWT, Swing, JavaFX & SWT 8
G png und Transparenz AWT, Swing, JavaFX & SWT 4
F JWindow mit einem Bild und Transparenz AWT, Swing, JavaFX & SWT 4
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
M Hintergrundbild und grafischer Button (Transparenz Probleme) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben