Eine Art "Image Map" in Java

Status
Nicht offen für weitere Antworten.

babuschka

Top Contributor
Hallo zusammen,

bin dabei eine GUI (für ein einfaches Spiel) zu konstruieren und der bisherige (recht technische) Entwurf sieht wie folgt aus: http://www.badongo.com/pic/614011

Jetzt möchte ich, dass wenn man mit dem mousecursor über die Spielfläche fährt (Kacheln) immer über dieser Kachel eine gelbe Raute (siehe Bild) aufleuchtet, über der sich der (unsichtbare) mousecursor befindet. Ich hoffe ihr versteht, was ich meine.

Ist das möglich? Und wenn ja, kann mir jemand eine grobe Vorgehensweise angeben, mit der ich weiter komme? Vielen Dank schonmal!

Gruß,
squirrel
 

Wildcard

Top Contributor
Na das kommt mir doch sehr bekannt vor :wink:
Ich schätze mal du bist mit meinen Anregungen nicht wirklich vorwärts gekommen?
 

Marco13

Top Contributor
Hm - an die Component, wo du das reinzeichnest, kannst du einen MouseMotionListener hängen. Wenn die Maus bewegt wird, wird ausgerechnet, in welchem Feld sie ist, und dieses Feld wird dann gelb umprahmt. Beschreib' ggf. das Problem nochmal genauer...
 

babuschka

Top Contributor
Hallo Wildcard,

du sagtest damals, ich soll mit einem MouseMotionListener herausfinden über welcher Raute der Cursor ist und diesem ein 'isSelected' Flag oder etwas in der Art setzen. Das Problem ist aber, genau dass ich nicht weiß, wie ich das machen soll. Also wie erstelle ich eine Image Map, sodass immer genau die gewünschte Raute aufleuchtet? Rein handwerklich.

Gruß,
squirrel
 

Wildcard

Top Contributor
'Rein Handwerklich' muss dein Objekt in der Lage sein einen Rahmen zu zeichnen wenn ein bestimmtes Flag auf true steht.
Dieses Flag wird gesetzt wenn der Cursor über dem Objekt steht.
Wie das im Detail aussieht hängt davon ab ob du vorhast mit Standard GUI Komponenten zu arbeiten (davon würde ich in deinem speziellen Fall eher abraten), oder ein eigenes Lightweight Framework implementierst.
 

babuschka

Top Contributor
Hallo Marco13,

hab sogar schon einen MouseMotionListener implementiert, mit dem ich immer die aktuelle mouseposition auslese und ausgebe. Das Problem sehe ich genauer hier:

Wie definiere ich diesen (von der Form her: Raute) doch rechte schwierigen Auswahlbereich? Also wenn alternativ z.B. einfach nur ein Rechenkästchen-Muster hätte, wäre das mit der Definition der Auswahlbereiche doch erheblch einfacher. Meine Idee ist, dass ich einfach die Images selbst, die ja nur eine Raute und daneben "Transparenz" enthalten als Vorlage dienen könnten, eben den Bereich zu definieren, der ein "RollOver" haben soll.

Gruß,
squirrel
 

Wildcard

Top Contributor
Das kannst du sowohl verwenden um den Rahmen zu zeichnen, als auch für die geometrischen Berechnungen (contains,...).
 

babuschka

Top Contributor
Ist es denn grob richtig, wenn ich zunächst eine Klasse

class Kachel extends Polygon

schreibe? Dann habe ich vor, an der Stelle, an der ich bisher in meinem JFrame einfach die Bodenkacheln nebeneinander zeichne, Objekte der Klasse Kachel zu zeichnen.

Diese Klasse hat dann Methoden, die die Mausposition überwachen und ggf. das Image verändern. Richtig?
 

Wildcard

Top Contributor
Ja, das kannst du schon so machen.
Eine Sache würde ich allerdings ändern:
In deinem Fall hast du recht viele dieser Polygone.
Anstatt das jedes Polygon darauf hört ob sich die Maus in ihm befindet oder nicht, könntestt du das auch an zentraler Stelle erledigen und dann auf dem entsprechenden Kachel-Objekt setSelected(true/false) aufrufen.
 
G

Gast

Gast
hmm, du hast doch bestimmt eine klasse "Stein", davon erstellst du ja objekte, und zeichnest diese in dein spielfeld.

wenn du nun in deiner "stein" klasse einfach noch n mouselistener verwendest, und bei mouveover, eine paint methode anstösst, sollte es doch funzen, oder?
 

Marco13

Top Contributor
Hm. Wie ZEICHNEST du denn die Rauten? Also, um sie zeichnen zu können, mußt du ja ihre Form kennen, und wenn du ihre Form kennst, kannst du auch gucken, ob der Mauscursor darin enthalten ist. Aber wenn's mit Polygon geht, ist ja vielleicht schon OK.
 

babuschka

Top Contributor
Hallo zusammen,

vielen Dank fuer eure wertvollen Gedanken. Ich bin mittlerweile total verzweifelt. Ich merke, dass ich mich viel zu wenig mit Java auskenne und das einarbeiten in die ganzen speziellen Themen extrem zeitaufwändig ist! Ich habe das Gefühl, dass meine Klassen total umständlich und auch teilweise unsinnig programmiert sind ... nichstdestotrotz funktioniert es ganz gut:

Habe eine Main-Klasse, die ein GameFrame-Objekt (extends JFrame) erstellt und dort wird dann ein neues GamePanel-Objekt (extends JPanel) erstellt. In meiner GamePanel-Klasse ist in GamePanel() ein MouseListener integriert und ansonsten ALLES was ich zeichne in der protected void paintComponent(final Graphics g)-Methode. Innerhalb dieser Methode erstelle ich ein Level-Objekt, welches die Daten des Levels enthalten, die die paintComponent-Methode braucht, um die Kacheln zu zeichnen.

Und genau an dieser Stelle möchte ich ansetzen:

1. kann ich nicht einfach statt die Kacheln (in einer komplizierten Schleife) zu zeichnen an dieser Stelle einfach Objekte vom Typ Kachel konstruieren? Ich habe hier bereits mehere Ansätze in den letzten 5 Tagen ausprobiert, alles ohne Erfolg!

2. Wie kann ich mein Programm / Konzept "entwirren"?


@Gast: ja, genau so habe ich mir das gedacht - leider laufe ich mit verschiedenen Ansätzen gegen eine Wand...

@Marco13: die Rauten zeichne ich bisher (also ohne RautenOBJEKT) einfach mittels drawImage und einem transparenten GIF.

@Wildcard: die Klasse Polygon ist echt mächtig und genau das richtige für meine Zwecke! Aber leider komme ich zu keinem brauchbaren Ergebnis.


Wäre super, wenn mir jemand helfen könnte, die Struktur zu verbessern. Ich würde mich auch über ein alternatives Gerüst freuen, wenn da jemand eine spontane Idee hat.

Vielen Dank und viele Grüße,
squirrel
 

Wildcard

Top Contributor
Ja, die Idee ist die richtige.
Du brauchst eine Klasse Kachel.
Davon erstellst du dir einige die du in einer Collection speicherst.
Eine Kachel besitzt intern ein Polygon Objekt das den Großteil der Arbeit macht, und hat eine draw(Graphics2D g) Methode.
In der draw Methode wird dann lediglich die Farbe gesetzt und g.draw(polygon) aufgerufen.
In der paintComponent Methode iterierst du über die Collection und rufst auf jedem Objekt draw(g) auf.
 
G

Guest

Gast
Hallo Wildcard,

vielen Dank für deine Antwort. Ich habe aber ein Paar Fragen zu den einzelnen Punkten:

1. Du brauchst eine Klasse Kachel.
ist klar

2. Davon erstellst du dir einige die du in einer Collection speicherst.
Also z.B. mittels einer irdendwie gearteten Schleife Kachel-Objekte erstellen (Daten dazu auf Level.class) und dann in Collection speichern? Wäre auch froh wenn ich erstmal ein einziges Objekt hinbekommen würde.

3. Eine Kachel besitzt intern ein Polygon Objekt das den Großteil der Arbeit macht, und hat eine draw(Graphics2D g) Methode.
Kachel abgeleitet von Polygon, also Kachel extends Polygon? Meinst du mit intern, dass das Polygon quasi nicht gezeichnet wird, weil ich möchte ja keine solid Farbfläche, sondern eine bitmap.

4. In der draw Methode wird dann lediglich die Farbe gesetzt und g.draw(polygon) aufgerufen.
Hmm, jetzt wird das Polygon wohl doch gezeichnet?!

5. In der paintComponent Methode iterierst du über die Collection und rufst auf jedem Objekt draw(g) auf.
Wo wird denn die Bitmap gezeichnet? In draw im Kachel-Objekt oder in paintComponent?

Danke und Gruß,
squirrel
 

Wildcard

Top Contributor
3. Extends Polygon würde nicht machen, ein Polygon wird einfach ein Member der Kachel.
Stimmt, du willst ja ein Bild zeichnen. Dann dient das Polygon hauptsächlich für die Geometrie-Berechnung.
Weiterhin kannst du dir den Rahmen den du anzeigen willst wenn ein Feld ausgewählt wird mit einem Polygon zeichnen.

4.
Hat sich dann erledigt.

5.
In der draw der einzelnen Objekte. Die paintComponent ruft die draw Methode jeder Kachel auf.
Allerdings habe ich nicht ganz verstanden ob du jetzt ein bitmap hast, oder eins pro Kachel.
Wenn es nur eins ist, würde ich es in der paintComponent zeichnen.
 

babuschka

Top Contributor
Bevor ich mich unglücklich mache, möchte ich dir/euch mal kurz meinen bisherigen Code zeigen (Kacheln nicht als Objekte) und um konstruktive Kritik bitten:

1. Klasse GameFrame
2. Klasse GameGraphics
3. Klasse Level

Meine Frage ist: kann/soll ich auf meinem obigem Code aufbauen um die Kacheln als Objekte zu realisieren? Oder ist alles zu verworren? Sollte ich Teile in eigene Klassen auslagern? Oder generell etwas anders machen?

Danke und Gruß,
squirrel
 

Wildcard

Top Contributor
Einige Unschönheiten drin.
-Die paintComponent ist viel zu lang und aufwendig.
-Das entzerrt sich wenn du Objekte verwendest.
-in der PaintComponent sollten nach Möglichkeit keine Objekte instanziert werden
-Bilder in der paint laden ist ein absolutes no-go
 

babuschka

Top Contributor
Okay! Danke schonmal.

1. Meinst du es macht Sinn meine Kachelobjekte vom Level instanzieren zu lassen?

2. Wo soll ich denn dann meine Bilder laden? Soll ich eine Art Preloader Klasse bauen?
 

babuschka

Top Contributor
Okay, haben jetzt eine Klasse Kachel, die jetzt das Image auf unser Panel zeichnen soll. Die Bilder werden im Konstruktor der Kachel geladen.

Wie kann die Kachelklasse in das Panel zeichnen bzw. wie/wo muss die draw-Methode implementiert werden? Stehe hier voll auf dem Schlauch.

Danke und Gruß,
squirrel
 

Wildcard

Top Contributor
In der Kachel eine draw(kann auch anders heißen) die als Parameter ein Graphics Objekt (vom JPanel) bekommt auf das sie zeichnen kann.
 

babuschka

Top Contributor
Ich möchte in der Kachel drawImage verwenden. Das klappt aber leider nicht. Es heißt immer "The method drawImage is undefined for the type Kachel". Wie kann ich das ändern?
 

babuschka

Top Contributor
Hab jetzt meine Level-Klasse verändert und in GameGraphics folgendes Konstrukt eingebaut (natürlich erstmal nur zum testen, deswegen "harte Werte".

Ich muss leider nochmal nachfragen: wie muss denn jetzt meine draw()-Funktion in Kachel aussehen?
 

babuschka

Top Contributor
Okay, das funzt jetzt.

Aber jetzt zum Wesentlichen:

1. Wie bringe ich jetzt die Klasse Polygon mit ins Spiel? Du sagtest was von member? Könntest du vielleicht anhand meines Codes skizzieren, wo ich ansetzen muss?

2. Wo bringe ich die Listener unter, die das Polygon dann "auf" der entsprechenden Kachel aufleuchten lassen sollen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Wie skaliere ich ein Image in eine bestimmte größe? AWT, Swing, JavaFX & SWT 2
F JFrame in eine Image umwandeln AWT, Swing, JavaFX & SWT 4
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
J Ich kriege eine Fehler Messesage bei meinem Media Player AWT, Swing, JavaFX & SWT 8
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
Lukas2904 Wie speicher ich eine Einstellung? AWT, Swing, JavaFX & SWT 1
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
P Swing Icon einfügen wirft eine Fehlermeldung AWT, Swing, JavaFX & SWT 3
F Variablen an eine Form binden? AWT, Swing, JavaFX & SWT 2
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
Informatiknoob AWT Zahlenraten (eine Zahl zwischen 1 und 10) AWT, Swing, JavaFX & SWT 1
A eine Fehler AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J JavaFX Die Webview stellt eine Webseite nicht dar AWT, Swing, JavaFX & SWT 0
M JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen AWT, Swing, JavaFX & SWT 3
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
Thallius Swing JDatePicker oder Sucht jemand eine Aufgabe? AWT, Swing, JavaFX & SWT 0
K Wie kann ich eine Variable zwischen Tab Klassen weitergeben ? AWT, Swing, JavaFX & SWT 7
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
M Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung? AWT, Swing, JavaFX & SWT 2
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
A JFace Wizard: Ist es möglich eine Page zu löschen? AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
D AWT Das ganze GUI in eine Klasse? AWT, Swing, JavaFX & SWT 1
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
M Über eine JMenuBar überprüfen ob ein JCheckBoxMenuItem selectiert ist. AWT, Swing, JavaFX & SWT 4
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
A JavaFX Eine Task mit einer ProgressBar verbinden AWT, Swing, JavaFX & SWT 0
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
G 2D-Slider bzw. eine graphische Auswahlkomponente die sich so verhält AWT, Swing, JavaFX & SWT 6
H Lust auf eine Open-Source Lösung für universelle Java Client-Technologie? AWT, Swing, JavaFX & SWT 11
T Aus JAVA.Jar GUI eine Flash-Datei machen AWT, Swing, JavaFX & SWT 3
S 5 Playlisten eine Skip() AWT, Swing, JavaFX & SWT 4
M SWT Browser nur eine Seite erlauben AWT, Swing, JavaFX & SWT 3
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
I Anhand ButtonGroup eine Auswahl treffen AWT, Swing, JavaFX & SWT 2
B Nach dem Öffnen des Dialogs eine Aktion ausführen. AWT, Swing, JavaFX & SWT 6
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
A Swing Text auf eine Seite an beliebigen Orten schreiben AWT, Swing, JavaFX & SWT 6
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
Rudolf Swing Wie testet man am besten eine GUI? AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
F GroupableTableHeader zeigt nur eine Zeile AWT, Swing, JavaFX & SWT 4
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
M Eine Kugel nach rechts bewegen AWT, Swing, JavaFX & SWT 5
C Swing NullPointerException beim Hinzufügen von Checkboxes in eine ArrayList AWT, Swing, JavaFX & SWT 5
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
M Auf einem Bild eine Markierung aufziehen AWT, Swing, JavaFX & SWT 3
R Eine Instanz von JPanel mehrfach hinzufügen AWT, Swing, JavaFX & SWT 2
B eine .jar erzeugen AWT, Swing, JavaFX & SWT 4
M In JField eine Kommazahl darstellen java.lang.NumberFormatException AWT, Swing, JavaFX & SWT 4
N Button on click eine andere Klasse aufrufen... AWT, Swing, JavaFX & SWT 2
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben