# 2d Karte aus einzelnen tiles



## Ein Gast (11. Jul 2007)

Ich hab gestern eine zweidimensionalen Karte aus einzelnen tiles (gras, mountain, ..) erstellt. Welches title verwendet wird, wird in einem zweidimensionalen array mit int werten festgehalten. (z.b. 0 = gras) Meine eigentliche Map extended ein Jpanel und liegt in einem frame. Überschrieben hab ich dann die repaint funktion des panels. (Den code hab ich im moment leider nicht bei der hand, da dieser aber eh nicht kompliziert ist machts hoffentlich nichts)

Diese repaint funktion liest das array aus und lädt dann die graphiken von der platte um sie anzuzeigen. Im vorhinein wird ein zentrales tile ausgewählt (also beim start 0,0) dann wird der sichtbare bereich des jpanels mit den verschiedenen tiles angemalt. (somit zeichne ich nichts was ich nicht sehe).

Wenn ich scrollen will dann clicke ich auf ein tile (das nicht die mitte ist). Dieses tile wird dann als neuer mittlepunkt gesetzt und die repaint funktion des jpanels wird aufgerufen. (Dadurch wird eben gescrollt).


Eigentlich funktioniert das soweit auch. (Was mich eigentlich überrascht hat, programmier sonst nur mit swing ohne selber was herumzupainten).

Jetzt zu meinen Fragen.

1) Wie kann ich feststellen wann der user über einen rand hoovert um zu scrollen? Ich glaub es gibt im mouselistener ein onmove (so ähnlich halt). Soll ich da überprüfen ob die mouseposition über dem rand ist und dann scrollen? (sowas wie; if(e.x == map.rechterrand.x) scrollright()?)

2) Wenn ich ein neues tile als center selektie und meine map wird nach gescrollt so gibt es einen gewissen lag obwohl die map nicht komplex ist und auch nicht seh groß ist. Wie kann ich das beschleunigen? Liegt der lag am laden der images von der platte?


Hoffentlich könnt ihr mir im moment auch ohne sourcecode helfen. Später am nachmittag kann ich diesen, wenn benötigt, nachliefern.


----------



## Beni (11. Jul 2007)

zu 1: ein MouseMotionListener reagiert auf Mausbewegungen.
zu 2: vermutlich ist es das Laden der Bilder. Bilder laden ist halt nicht schnell (die müssen noch dekomprimiert werden, Speicher muss angefordert werden, ...).


----------



## Ein Gast (11. Jul 2007)

Danke mal für die Antwort. Jetzt ist zumindest der erste Punkt klar. 

Ok, wie kann ich das bilder laden beschleunigen? (50*50 .png tiles). Ist es da eine gute idee vielleicht die bilder alle am anfang zu laden, im ram lassen und dann bei bedarf aufs panel painten?


----------



## merlin2 (11. Jul 2007)

Ja.


----------



## Beni (11. Jul 2007)

Ein Gast hat gesagt.:
			
		

> Ok, wie kann ich das bilder laden beschleunigen? (50*50 .png tiles). Ist es da eine gute idee vielleicht die bilder alle am anfang zu laden, im ram lassen und dann bei bedarf aufs panel painten?


Das ist die übliche Vorgehensweise. Vergiss nicht, dass du ein paar Megabyte RAM hast: Optimierungen die Speicher sparen sollen, kannst du getrost vergessen :wink:


----------



## Ein Gast (11. Jul 2007)

Danke!

Es läuft jetzt mal flüssig (ich hab mir nicht gedacht dass das so einen unterschied macht. Sollte nicht das os sachen die man oft verwendet sowieso in den ram laden? ???:L ) und das scrollen geht auch recht schön.

Jetzt noch ein paar allgemeine fragen.

Ist mein Ansatz so eigentlich verwendbar? Nicht das ich mir da eine Mühe gebe nur um draufzukommen das man ein jpanel nicht verwenden sollte. (oder sowas in der art)

Falls ich mal wirklich ein spiel auf dieser map aufbauen lasse brauch ich ja auch Buttons bzw. labels und dergleichen. Wie baue ich das gescheit in mein Spiel ein, sodass die oberfläche auch homogen ausschaut? (Einen Button mit neuer Oberfläche selber programmieren wird mir bestimmt nicht gelingen, etwas auf den bildschirm zu kritzeln ohne label vermutlich schon eher.) 

Im moment hab ich außerdem eine borderlayout in meinem frame wobei die map im center liegt. Eigentlich hätte ich vor dann die anderen Komponenten der gui außen herumzulegen. (infos, minimap (wobei ich keine ahnung hab wie man eine minimap macht), dergleichen..) Ist das ein guter Ansatz? (Oder ist das zumindest ein ansatz mit dem ich arbeiten kann?)


Fragen über Fragen, ich hoffe ihr werdet mir die Antworten sagen.  :wink:


----------



## Quaxli (12. Jul 2007)

Das klingt ganz gut, vom Ansatz her.

Vielleicht noch ein Tipp zum Aufbau der Map. Ich habe hier mal eine Lösung gebastelt, die mir immer noch gut gefällt, vor allem hatte ich trotz großer Karte keine Probleme:

- Ich habe eine Klasse zur Verwaltung der Bilder gebastelt und dort alle initial geladen und gespeichert. Also im Prinzip ähnlich wie bei Dir (0 = Gras, etc.).
- Zusätzlich habe ich mir eine Klasse Tile gebaut, die hauptsächlich von Rectangle erbt und ein paar Zusatz-Informationen enthält, wie z. B. die Nummer des Bildes (0 = Gras)
- Die Verwaltung der Tiles übernimmt eine weitere Klasse. Ich hatte damals eine Collection anstelle eines Arrays verwendet, aber da hat mehr mit persönlichen Vorlieben zu tun.

Beim Zeichnen geschieht folgendes:
- Aufgerufen wir eine paint-Methode der Klasse, die die Tiles verwaltet
- diese loopt über die Collection und ruft die paint-Methode der einzelnen Tiles auf
- diese Tiles holen sich zum Zeichnen die Bilder aus der Klasse, welche die tatsächlichen Bilder verwaltet.

Vorteil: Jedes grafische Tile wir genau einmal im Speicher gehalten.

Das mit den Buttons und BorderLayout klingt schon mal ganz gut. Wenn Du die Oberfläche noch grafisch gestalten willst, hätte ich noch folgenden Tipp. Schau Dir mal in einem Tutorial und in der API die Infos zur GlasPane an. 
Ich habe das mal in einem Spiel gemacht:
- erst eine ganz normale Gui mit Swing basteln
- Programm starten, Screenshot machen, damit man weiß wo die Schaltflächen sitzen müssen
- mit einem beliebigen Grafik-Programm den Screenshot verändern. 
- diesen Screenshot als Image laden und in die GlasPane zeichnen (und dafür sorgen, daß Mausklicks "durch gehen")

Ich habe das zwar mit einem kompletten Frame gemacht, aber es geht sicher auch nur "teilweise".
Das Ergebnis findest Du hier: 

Seafox-ZIP
Seafox-WebStart
(Leider ruckelt das Spiel auf manchen Rechnern) 
Die Lösung mit der GlasPane ist das "Waffen-Geschäft". 

Viel Spaß weiterhin.


----------



## Ein Gast (12. Jul 2007)

Werd mir mal beide deiner Vorschläge genauer anschauen, klingen tun sie ja mal gut. Jetzt hab ich eine etwas andere Frage;


Die Map hab ich ja wie gesagt in einem array und ich werd dies auch lassen. Es ändert sich ja nicht viel und die Zugriffsdauer ist auch sehr gut.

Nur wie speicher ich anfällige Gebäude, Einheiten und Resourcen (Spiel wird so eine Art Civ/Stronghold Mischung (oder sollte mal werden))? Vermutlich mit Listen da sich im Bereich des Hinzufügens und Entfernens viel tun wird. Aber wenn ich jetzt, sagen wir mal 4 Spieler habe, ist es dann besser eine Player Klasse zu erstellen und dann in dieser Klasse die jeweiligen Gebäudelisten zu haben oder sollte ich das mit einer globalen Liste realisieren? Sowas wie eine Player klasse brauch ich ja auf alle Fälle damit ich etwaige resourcen abspeichern kann.

Vermutlich ist das jetzt nur geschmackssache, aber ich würde trotzdem gerne andere Meinungen hören. Vielleicht (vermutlich) gibt es ja einen besseren Ansatz.


@Quaxli

Dein Spiel ist recht witzig zu spielen. Bei mir sind jedoch zwei Bugs aufgetreten. Ein einziges Mal ist der horizontale Torpedo über der Wasserlinie hängengeblieben. Dann ist ein Schiff draufgefahren und ich hatte einen Kill mehr.
Leider ist mir das Spiel nach einiger Zeit sang und klanglos untergegangen (abgestürzt  ). Hat sich einfach ohne Fehlermeldung aufgehängt.


----------



## Ein Gast (13. Jul 2007)

Noch eine weitere Frage;

Wenn ich eine isometrische Karte verwende wie kann ich einen mouselistener verwenden? Ich hab zwar dann die screen koordinaten aber ich weis nicht wie ich sie in grid-koordinaten umwandle. Hier fehlt mir leider die logik/mathematik. Kennt vielleicht jemand ein tutorial bzw. weis wie ich das lösen kann?

Oder gibt es einen anderen besseren bzw. einfacheren Ansatz?


----------

