Denkanstoss benötigt

Status
Nicht offen für weitere Antworten.

ReatKay

Mitglied
Guten morgen miteinander

Ich brauch mal einen Denkanstoss.. ich arbeite gerade an einem Tile-basierten Spiel. Relativ simpel aufgebaut, Tiles 50x50 px ohne perspektivische Verzerrung (direkte von oben nach unten Ansicht).

Nun dachte ich erst, die Tiles am einfachsten als einzelne JLabels mit hinterlegtem Icon zu platzieren - jedoch komme ich da zum Problem, das ich bewegliche Objekte nicht darauf platzieren kann (Überlappung bei JLabels schwer).

Nächster Versuch: Ich zeichne meine Tiles mit drawRect(). Problem nun: Kann natürlich keine Listener adden, da die Rects ja nicht von JComponent erben.

Jetzt hatte ich die Idee, wieso nicht eine neue Komponente erstellen, die die Methode addMouseListener() erbt und nichts anderes macht ausser ein Rechteck gemäss den übertragenen Koordinaten erstellen. Die Frage ist nun, von welchem Element vererbe ich am besten die benötigte Methode , bzw. von welchem Element soll ich mein Tile ableiten?

Bin für jeden Vorschlag dankbar :)

Gruss
Royal Flush
 

Quaxli

Top Contributor
Nun hast Du ja leider nicht geschrieben, was Du vorhast, so daß konkrete Vorschläge passen könnten oder u. U. auch ungeeignet sind.

Labels nicht zu verwenden halte ich schon mal für gut. ;)

Ich persönlich würde das möglichst einfach halten: Eigene Klasse Tiles, die von Rectangle oder Rectangle2D.Double erbt. Wenn es notwendig ist, Mouse-Klicks abzufangen, könnte man auch in der Spielschleife mit contains prüfen, ob ein angeklickter Punkt innerhalbe Deines Rechtecks liegt.

Ob dieser Vorschlag zu Deinem Vorhaben/Konzept paßt, mußt Du selbst beurteilen.
 

ReatKay

Mitglied
Hallo Quaxli

Das mit dem Klickabfangen ist schon mal ne gute Idee :). Im Prinzip also immer bei einem Klick die Mousekoordinaten holen und prüfen in welchem Rect das liegt...

Am liebsten wär mir natürlich, wenn ich ein Rect hätte, auf das ich direkt einen MouseListener pflanzen könnte.

Folgendes habe ich vor:

Ein einfaches Real-Time-Strategy-Game. Tilebasierte Map, direkte Ansicht von oben. Der Spieler kontrolliert eine Figur die sich auf den Tiles bewegt (das ist der Grund warum ich die Labels verworfen habe, denn ich kann ja kaum Label auf Label legen auf Grund der Architektur der Label-Klasse).

Wäre es nicht theoretisch möglich, von der höchsten Klasse - von welcher JLabel abstammt und von welcher Jéabel die Methode addMouseListener erbt - eine Ableitung zu schaffen, bei welcher ich dann in der Methode paint() das Rect zeichnen lasse? Wenn ja: Von welcher Klasse müsste diese Ableitung ausgehen?

Gruss
Royal Flush
 

Quaxli

Top Contributor
ReatKay hat gesagt.:
Wäre es nicht theoretisch möglich, von der höchsten Klasse - von welcher JLabel abstammt und von welcher Jéabel die Methode addMouseListener erbt - eine Ableitung zu schaffen, bei welcher ich dann in der Methode paint() das Rect zeichnen lasse? Wenn ja: Von welcher Klasse müsste diese Ableitung ausgehen?

Nun ja, lt. API wäre das Component. Schau mal in die API, was Du da an Methoden mitübernimmst, die Du vermutlich nie brauchen wirst.
Ich persönlich habe immer einen Schmerz damit, für so etwas AWT- oder Swing-Komponenten her zu nehmen. Ich würde es schlank halten und selbst basteln.

Einfachste Möglichkeit zu einer Lösung zu kommen: Bau Dir ein kleines Testprogramm mit 3 x 3 Felder oder so und probiere es aus.
 

Marco13

Top Contributor
Naja - das Problem sind nicht die Methoden, die man von (J)Component erbt - eher die vielen, vielen Fields (die ich hier http://www.java-forum.org/de/viewtopic.php?p=401218&highlight=#401218 mal aufgelistet hatte).

....in der Spielschleife mit contains prüfen, ob ein angeklickter Punkt innerhalbe Deines Rechtecks liegt.
ist vielleicht garnicht notwendig: Wenn die Tiles eine Component "voll" ausfüllen (was sie der einfachkeit halber könnten und vermutlich auch sollten) und die Tiles immer eine Feste Größe (von 50) haben, kann man bei einem Mausevent einfach mit
int tileX = event.getX()/50;
int tileY = event.getY()/50;
die Koordinaten der angeklickten Tile rausfinden.
 

ReatKay

Mitglied
Hey Marco

Omg, auf sone einfache Lösung hät' ich mal kommen sollen ;)

Ich hab mir jetzt ne Map gemacht mit den Koordinatenpaaren und überprüfe für jedes Paar ob die MousCoords drin liegen - rofl :p Dabei wärs bei meiner 50/50 Tilemap so einfach mit der Division durch 50 ... rofl :p

Danke dir für den Wink mit dem Zaunpfahl ;)
 

Titanpharao

Bekanntes Mitglied
es würde aber auch mit JLabels gehen ... nullLayout was zuerst kommt liegt ganz unten alles andere darüber.
JLayeredPane und schon überlappen sich auch keine Buttons mehr...
 

ReatKay

Mitglied
Mhn ja klar : möglich... aber nicht sehr "wohlgeformt". Beim Null-Layout bestehen folgendes Problem:

Wird die Auflösung geändert bzw. das Fenster in seiner Grösse verändert, sieht das danach grottenhässlich aus...

Mittlerweile habe ich die Lösung von Quaxli/Marco implementiert und bin mit dem Ergebnis auch zufrieden...


Kann closed werden
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben