Hallo zusammen,
ich bin dabei eine Art Brettspiel zu programmieren, wobei das Spielfeld aus Feldern in Form gleichseitiger Dreiecke besteht. Auf diesem sollen Spielfiguren verschoben werden (Vielecke mit >4 Ecken). Das Spielfeld steht soweit, jetzt überlege ich, wie ich am Besten das Ziehen mit den Spielfiguren umsetze. Im Prinzip sehe ich zwei mögliche Vorgehensweisen:
1) Ich implementiere einen MouseListener für das Panel, auf dem das Spielfeld gezeichnet wird und Frage im Falle von z.B. einem Pressed-Event ab, welche der Figuren gewählt wurde und Verfahre ebenso mit einem Released-Event um das Zielfeld zu ermitteln.
Eine ähnliche Vorgehensweise habe ich in diesem Beitrag gefunden.
2) Ich erstelle die Spielfelder und -figuren als Subklassen von Component (bzw. einer Subklasse von Component), damit ich in der Klasse auf addMouseListener zurückgreifen kann, um somit jedem Objekt seinen eigenen Listener zu spendieren.
Diese Vorgehensweise wird in folgendem Beitrag praktiziert.
Dies wäre meiner Meinung nach die elegantere Lösung, es stellt sich nur ein Problem. Die "bounds", nach denen ein Component einem MouseEvent zugeordnet werden, können nur als Rechteckfläche, nicht aber als Polygon vorgegeben werden:
Natürlich könnte man jetzt einfach auf Herangehensweise 1 zurückgreifen, mir ist aber ein Problem in den Sinn gekommen, bei dem das nicht möglich ist.
Beispiel:
Wenn eine Spielfigur ausgewählt wurde und per Drag&Drop auf ein anderes Feld gezogen wird, dann soll das Feld beim Darüberziehen der Spielfiguren mit einer farblichen Umrahmung hervorgehoben werden. Dafür müsste ich jedoch ein MouseEntered-Event für ein dreieckiges Polygon mit dem Listener abfangen. OK, theoretisch könnte man das vielleicht auch über mouseDragged im Panel realisieren, aber dann müsste ich mit jedem Aufruf sämtliche Felder mit contains(e.getX(), e.getY()) durchgehen.
Würde mich interessieren, ob dafür jmd eine Idee hat.
ich bin dabei eine Art Brettspiel zu programmieren, wobei das Spielfeld aus Feldern in Form gleichseitiger Dreiecke besteht. Auf diesem sollen Spielfiguren verschoben werden (Vielecke mit >4 Ecken). Das Spielfeld steht soweit, jetzt überlege ich, wie ich am Besten das Ziehen mit den Spielfiguren umsetze. Im Prinzip sehe ich zwei mögliche Vorgehensweisen:
1) Ich implementiere einen MouseListener für das Panel, auf dem das Spielfeld gezeichnet wird und Frage im Falle von z.B. einem Pressed-Event ab, welche der Figuren gewählt wurde und Verfahre ebenso mit einem Released-Event um das Zielfeld zu ermitteln.
Eine ähnliche Vorgehensweise habe ich in diesem Beitrag gefunden.
2) Ich erstelle die Spielfelder und -figuren als Subklassen von Component (bzw. einer Subklasse von Component), damit ich in der Klasse auf addMouseListener zurückgreifen kann, um somit jedem Objekt seinen eigenen Listener zu spendieren.
Diese Vorgehensweise wird in folgendem Beitrag praktiziert.
Dies wäre meiner Meinung nach die elegantere Lösung, es stellt sich nur ein Problem. Die "bounds", nach denen ein Component einem MouseEvent zugeordnet werden, können nur als Rechteckfläche, nicht aber als Polygon vorgegeben werden:
Java:
setBounds(Rectangle r)
//bzw.
setBounds(int x, int y, int width, int height)
Natürlich könnte man jetzt einfach auf Herangehensweise 1 zurückgreifen, mir ist aber ein Problem in den Sinn gekommen, bei dem das nicht möglich ist.
Beispiel:
Wenn eine Spielfigur ausgewählt wurde und per Drag&Drop auf ein anderes Feld gezogen wird, dann soll das Feld beim Darüberziehen der Spielfiguren mit einer farblichen Umrahmung hervorgehoben werden. Dafür müsste ich jedoch ein MouseEntered-Event für ein dreieckiges Polygon mit dem Listener abfangen. OK, theoretisch könnte man das vielleicht auch über mouseDragged im Panel realisieren, aber dann müsste ich mit jedem Aufruf sämtliche Felder mit contains(e.getX(), e.getY()) durchgehen.
Würde mich interessieren, ob dafür jmd eine Idee hat.