Wie Objekte am besten anklickbar machen ?

Status
Nicht offen für weitere Antworten.

Cola_Colin

Top Contributor
Ich schreibe derzeit die Grundlagen für ein paar 2D Spiele in Java.
Hierzu möchte ich meiner Objekt Klasse, die die Basis aller Objekte der Spielwelt zur Verfügung stellt die Funktionen von MouseListener zur Verfügung stellen. Das heißt ich würde gerne wissen, wann der Mauszeiger eine Objekte betritt/verlässt/es anklickt/etc.

Dieses Problem hab ich früher unter Delphi mit der Kollisionsabfrage gelöst. 1 Pixel Objekt Mauspunkt gegen alle Objekte der Spielwelt sozusagen. Klappt zwar, kommt mir aber irgendwie plump vor.
Macht es also Sinn, diese Basisklasse meiner Spielweltobjekte von MouseAdapter erben zu lassen ? Und wie krieg ich dann raus, wann die Events ausgelöst werden müssen ?
Meine Objekte zeichnen sich als Image mit drawImage abhängig von Größe und Position. Ich vermute mal das es keine Möglichkeit gibt, ausser zu testen ob das angeklickte Pixel sich auf einem nicht transparenten Pixel eines Objekts befindet ?
 

Marco13

Top Contributor
Ja, sowas kann man beliebig groß aufziehen. Die von MouseAdapter erben zu lassen würde IMHO nicht so viel Sinn ergeben. Wenn du wirklich einen MouseListener verwenden willst, und nicht ein eigenes Interface, dann stellen sich etliche Fragen, die sich bei Swing-Components (für die MouseListener eigentlich gedacht sind) nicht auftauchen. Das fängt bei solchen Fragen an wie "Welche Events werden wo und wie und ann geworfen, wenn man über zwei Objekten ist, die sich überschneiden?", und hört bei solchen Fragen wie "Was liefert mouseEvent.getSource() wenn der Event von deinem eigenen Grafik-Ding kommt?" noch lange nicht auf.
 

byte

Top Contributor
Zeichnest Du Deine grafischen Objekte auf ein JComponent? Dann kannst Du dort einen MouseListener drauf legen. Über das MouseEvent bekommst Du ja die Cursor-Position (x,y). Du musst dann nur noch prüfen, welches Objekt sich an dieser Position befindet.

Ich würde jedes grafische Element als Klasse kapseln. Diese Klasse könnte neben einer paint() Methode zum Zeichnen auch ein Methode getShape(), der den Shape des grafischen Objekts liefert. Du kannst dann einfach mit Shape#contains(Point) prüfen, ob der Punkt des MouseEvents im Shape liegt. Auf diese Weise kannst Du das grafische Objekt zu einem MouseEvent bestimmen und damit dann irgendwas machen.

Du müsstest Dich dann evtl. noch wie Marco13 schon sagte um überlappende Objekte kümmern.


Eine andere (einfachere) Möglichkeit wäre, wenn jedes grafische Objekt selbst ein JComponent ist. Dann könntest Du das Event-Handling von Swing benutzen und direkt auf die grafischen Komponenten einen MouseListener hängen. Allerdings hast Du dann das Problem, dass das Shape (also die Bounding Box) von JComponents immer rechteckig sein muss. Das wäre wohl in vielen Fällen ein No-Go.
 

Marco13

Top Contributor
Zeichnest Du Deine grafischen Objekte auf ein JComponent? Dann kannst Du dort einen MouseListener drauf legen. Über das MouseEvent bekommst Du ja die Cursor-Position (x,y). Du musst dann nur noch prüfen, welches Objekt sich an dieser Position befindet.

Ja, das wäre der... "übliche" Ansatz - das ganze dann zusammen mit einem [c]interface Clickable[/c] oder so, da kann man schon einiges machen. Etwas ... "fummeliger" wird's aber evtl. aufgrund der Anforderung, dass auch MouseEntered und MouseExited-Events für die eigenen Objekte geworfen werden sollen. (Eine pragmatische Lösung ist nicht schwer: Man müßte innerhalb der Haupt-JComponent dann mit-tracken, über welchen Objekten man sich gerage befindet, und bei jeder Mausbewegung ensprechend den Änderungen Events rauswerfen - aber ob und wie man das dann strukturell gut und effizient machen kann, muss man sich eben überlegen...)
 

byte

Top Contributor
Man könnte es recht einfach mit einem boolean hovering lösen. Der o.g. Mechanismus setzt die Variable jeweils auf true oder false. MouseEntered, MouseExited resultiert dann aus dem Übergang hovering FALSE -> TRUE bzw. TRUE -> FALSE.

Aber Du hast schon recht, man muss gucken, wie man das ganze performant hinkriegt, vor allem wenn Repaints mit ins Spiel kommen und man "viele" grafische Komponenten hat.
 

Cola_Colin

Top Contributor
Ok, dann werd ich die Mausposition von dem Component nutzen, auf dem ich zeichne.
Folgend Events und Ansätze:

-> Mausklick/down/release
Hier würde ich testen müssen, auf welchem Objekt der Klick ausgelöst wurde.
Dazu würde ich die x,y Koordinate des Klicks auf dem Panel nehmen. Nun muss ich testen, welches meiner Spielobjekte(ja die sind gekabselt und werden von einer anderen Klasse in ner Liste verwaltet. Diese Klasse kriegt auch zuerst die Events des Panels mit) von diesem Punkt angeklickt wird. Dazu teste ich, ob der Klickpunkt in der BoundingBox eines Objektes liegt und wenn dem so ist, ob der betroffene Punkt Alpha ist oder nicht. (Wie macht man das in Java ? Im Speicher ein Bild erstellen, auf das zeichnen und dann getPixel() ?)
Überlappende Objekte sind dank einer Z Koordinate meiner Objekte kein Problem, denk ich.

-> Mouse enter/leave
Hier würde ich der verwaltenden Klasse ein Feld geben, in dem das Objekt drinne ist, über dem aktuell die Maus ist, bei jeder Mausbewegung muss das neugetestet werden. Danach werden dann Events verschickt.

Verbesserungsvorschläge ? :)

@byte:
Wie genau verhält sich das mit den Shapes ? Die Klasse kenn ich noch nicht, bin eben ziemlich neu in Java ;)
Laut der Api-Doku kann man damit Formen verarbeiten, aber ich vermute das es nicht trivial ist so einen PathIterator von einem Bild zu kriegen ?
 

Marco13

Top Contributor
Dazu teste ich, ob der Klickpunkt in der BoundingBox eines Objektes liegt und wenn dem so ist, ob der betroffene Punkt Alpha ist oder nicht. (Wie macht man das in Java ?
Am besten eben wegabstrahiert: Mit einem interface
Code:
interface Clickable
{
   boolean isHitBy(int x, int y);
}
das dann aut unterschiedliche Arten implementiert sein kann. Bei einem Objekt, das irgendwie als BufferedImage mit Alpha-Kanal gespeichert ist, wäre es
Code:
class ClickableImage implements Clickable
{
    private int positionX, positionY = ...
    private BufferedImage image = ...

    public boolean isHitBy(int x, int y)
    {
        // Ggf. erst einen schnellen bounding-box-check, und ggf. false zurückliefern,
        // ansonsten:
        int rgb = bufferedImage.getRGB(x-positionX,y-positionY);
        return containsSomeAlphaComponent(rgb); // Ein paar bit-abfragen...
    }
}
Wenn man eine Klasse hat, für die es schon ein fertiges Shape gibt, wäre das
Code:
...
    public boolean isHitBy(int x, int y)
    {
        return theShape.contains(x-positionX,y-positionY);
    }
- einfach anders implementiert, aber nach außen ändert sich nichts.



-> Mouse enter/leave
Hier würde ich der verwaltenden Klasse ein Feld geben, in dem das Objekt drinne ist,

Die Maus kann ggf. auch in mehreren Objekten sein... Das meinte ich mit "da muss man sich was überlegen..." ;)
 

Cola_Colin

Top Contributor
Der Mauspunkt (ein Pixel) kann zumindest so wie ich das verstehe immer nur eine Position haben und auf dieser Position ist immer nur ein Objekt zu sehen, eventuell sind darunter andere, aber die interessieren dann nicht.

Ok dann kommt das in ein Interface im Moment verwende ich noch einfach nur Image, aber das lässt sich ja schnell ändern. Muss dann nur schaun, weil die Positionsbestimmung auf dem gezeichneten Image nicht ganz so einfach ist, da ich nur das Grundbild speichere. Beim zeichnen wird es dann noch rotiert und gestrecht. Aber da find ich schon ne Möglichkeit.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
J Objekte Java Basics - Anfänger-Themen 22
T Objekte mit arrays erstellen Java Basics - Anfänger-Themen 6
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
T 3D Objekte verarbeiten Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
E Objekte löschen Java Basics - Anfänger-Themen 9
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
G Übergeordnete Objekte abrufen Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
L Werte von Objekte addieren Java Basics - Anfänger-Themen 14
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
P Globale Objekte Java Basics - Anfänger-Themen 2
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
S Objekte indiziert erstellen Java Basics - Anfänger-Themen 27
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
A (Objekte Java Basics - Anfänger-Themen 6
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
I Objekte Hilfe Java Basics - Anfänger-Themen 8
G Klassen und Objekte Java Basics - Anfänger-Themen 2
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
R Attribute mehrerer Objekte ausgeben Java Basics - Anfänger-Themen 3
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
O ObjectOutputStream Anzahl Objekte festhalten Java Basics - Anfänger-Themen 17
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
J Best Practice Dateiinhalte validieren und auf Objekte mappen Java Basics - Anfänger-Themen 3
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
PaperHat Objekte in Array vergleichen Java Basics - Anfänger-Themen 9
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
PaperHat Programmieraufgabe - Objekte in Objekten Java Basics - Anfänger-Themen 2
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
T Klassen Klassenübergreifende Objekte erstellen lassen Java Basics - Anfänger-Themen 5
A Objekte verknüpfen Java Basics - Anfänger-Themen 2
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
M Klassen und Objekte Java Basics - Anfänger-Themen 2
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Array Objekte einer Klasse zuordnen Java Basics - Anfänger-Themen 15
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
Orkanson Objekte und Klassen Java Basics - Anfänger-Themen 8
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Objekte-Fragen Java Basics - Anfänger-Themen 1
T Objekte in der Methode Java Basics - Anfänger-Themen 8
F Alle Objekte einer Klasse nach Eigenschaft durchsuchen Java Basics - Anfänger-Themen 8
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
E Eine Instanzvariable und zwei Objekte Java Basics - Anfänger-Themen 14
N Objekte in ArrayList finden Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben