Swing Projekt Herangehensweise Swing

DrHasenbein

Mitglied
Stehe vor folgender Aufgabenstellung:

Einen kleinen "Verkehrsplaner" mit Java Swing programmieren, der es ermöglicht Straßenteile(Kurven,Geraden und Kreuzungen)Fahrzeuge auf einer Karte zu platzieren.Anschließend soll es möglich sein eine Simulation zu starten, die die Fahrzeuge über die Straße navigiert.

Die Oberfläche dafür steht schon (Karte ist ein JPanel).

Jz ist die Frage wie die Wegstücke und Fahrzeuge am besten repräsentiert werden um die Funktionalität am einfachsten umzusetzen.

Meine Idee: Karte mit z.B 50x50 Kacheln(JPanels) befüllen. Jede Kachel weiß darüber bescheid, was auf ihr platziert ist und in welche Richtung dieses Stück zeigt(Straßenöffnung nach N/S/W/O). Die Fahrzeuge würden also von Kachel zu Kachel springen.Sobald dies funktioniert wäre es noch möglich die Kachel in weitere kleinere Blöcke zu unterteilen um einen flüssigeren Ablauf zu gewährleisten.

Vll hatte jmd von euch schonmal eine ähnliche Problematik und kann mir sagen, ob ich mit meinen JPanel-Kacheln total auf dem Holzweg bin und es eventuell einen alternativen sehr eleganten Lösungsansatz gibt.

Vielen Dank im Voraus
 
Ja, den gibt es. Ich leite dich einfach mal zu diesem Thread weiter, weil es im Prinzip das selbe ist: http://www.java-forum.org/awt-swing-swt/111657-problem-doppelpufferung.html#post717661

In dem Thread findest du ein Code-Beispiel wie ein Kreis über ein JPanel bewegt wird. Im Prinzip müsstest du nur den Kreis mit dem Wagen (ich nehme mal an das ist ein IconImage) ind er paint(graphics) Methode ersetzen. Außerdem findest du in dem Thread auch ein paar nützliche Links zum Malen und Swing. Hoffe das hilft dir weiter. 🙂
 
Danke für den Beitrag.

Die Lösung mit dem wandern über x,yPosition++ innerhalb des Panels is soweit ja schön.Problematisch wird das ganze aber halt mit Gegenverkehr.Das Wegstück muss also logisch unterteilt sein.
 
Bastel dir eine Methode, die dir anzeigt, ob sich bewegende Objekte bei aktueller Richtung und Geschwindigkeit treffen, also kollidieren.

Also diese Logik musst du so oder so implementieren, da werden dir einzelne Kacheln auch nicht weiterhelfen. 😉
Außerdem ist es besser dies von der GUI zu trennen. 🙂

Ich persönlich würde für die Straßenstücke eine eigene Klasse schreiben, die von JPanel erbt, in der dann Informationen wie Kurven, ob man auf den jeweiligen Pixeln ein Wagen anzeigen lassen kann usw. hinterlegt sind.

Dann würde ich eine eigene Klasse Wagen schreiben. In dieser Klasse würde ich ein Bild für den Wagen hinterlegen, sowie Variablen für Geschwindigkeit, aktuelle Position usw.

Für die Koordinatenberechnungen würde ich mir ein eigenes DatenModell schreiben, dass zum einen über eine Container-Fähigkeit (also Methoden wie add(wagen), remove(wagen) usw.) und über eine Koordinatenberechnungseinheit (also Methoden wie "boolean collision(wagen...)", moveTo(wagen) usw.) verfügt.

Dann würde ich mit eine Klasse schreiben, die von JPanel erbt, die als die große Spielfläche dient. In der würde ich dann in der paint() Methode zu nächst alle Kacheln zeichnen lassen, dann alle aktuellen Positionen der Wagen.

Die Koordinatenberechnung würde ich in einen eigenen Thread auslagern, der nebenbei läuft und alle 20 Millisekunden schläft. Dieser Thread würde dann beim DatenModell die Werte der Wagen abfragen, prüfen, die neuen Koordinaten berechnen, dann prüfen, ob eine Kollision vorliegt oder das auf der jeweiligen Kachel möglich ist, falls eine Kurve kommt würde ich mit Math.random() wohl eine mehr oder weniger zufällige Wahl der Richtung (rechts, gerade, links) wählen, dann checken, ob der wagen fahren kann oder warten muss und wenn dann alles stimmt würde ich die Koordinaten des Wagens neu setzen. Wenn alle Wagen durch sind, dann würde ich repaint() des JPanels der Spielfläche aufrufen.

So, mit Sicherheit habe ich einiges vergessen oder außer Acht gelassen, aber so hast du Daten und GUI gut getrennt. 🙂
 
Außerdem ist es besser dies von der GUI zu trennen.
Ich persönlich würde für die Straßenstücke eine eigene Klasse schreiben, die von JPanel erbt,...
Vielleicht IST es bei genauem Lesen nicht so, aber es KLINGT erstmal, als wäre das widersprüchlich. Es stimmt schon: Man sollte das GUI und die Berechnung trennen. Es müßte also irgendwas geben, was ein Straßenstück repräsentiert, und was nichts mit JPanel & Co zu tun hat.

(BTW: Da jetzt noch Kollisionen reinzubringen klingt aufwändig... davon war doch eigentlich auch nicht die Rede, oder? ???:L )

Es wäre wichtig, zu wissen, WIE stark vereinfacht das werden soll. Sollen alle Straßen 2spurig sein, und es nur Kacheln, geben, und nur die angesprochenen? Dann gäbe es ja einen Satz von Kacheln, die über die Öffnungsrichtungen beschrieben sein könnten:
NS
EW
NW
NE
SW
SE
NSW
NSE
...
und noch ein paar 🙂

Wenn das als Modellierung des eigentlichen Straßennetzes reicht, wäre es IMHO angebracht, die Interpolation, das Bewegen der Autos auf einem Straßensegment, nochmal davon zu trennen. Der Zustand jeses Autos könnte dann z.B. beschrieben sein durch eine Kachel (x,y), eine Information über die Straße, die das Auto fährt (z.B. NS auf einer NSE-Kachel), und einen Wert zwischen 0 und 1, der die Position beschreibt, wo das Auto gerade ist. Dieser Wert könnte dann in "beliebig vielen" Schritten von 0 bis 1 erhöht werden, um das Auto in "beliebig vielen" Schritten über die Kachel fahren zu lassen.

Nur ein Gedanke.
 
Na ja, viele Wege führen nach Rom. Man kann natürlich für jede Teilaufgabe eine eigene Klasse schreiben. Das trägt zur sauberen Trennung bei und der Code würde verständlicher (evtl.). Die Kehrseite ist allerdings, dass man mehr Speicher braucht, evtl. auch mehr Rechenaufwand verursacht.

So oder so, vieles dürfte funktionieren. Aber zweifelsohne ist es keine einfache Aufgabe im Detail. 🙂
 
Danke für die Tipps.Hab das ganze jz über mehrfach geschichtete JPanels realisiert bei der die letzte eine drehbare Matrix aus Panels darstellt und auf welcher dann die Autos angezeigt werden.

Nochmals Danke!
 

Zurück
Oben