ich erstelle mir eine simple 2D-Karte. Alle Tiles sind 32x32 Pixel groß. Die Informationen werden in folgender Form gespeichert:
Code:
X:Y=Textur
Beispieldatei:
Code:
0:0=img\tile1.jpg
32:32=img\tile2.jpg
64:64=img\tile3.jpg
Also gehe ich die Datei durch und lese X, Y und die Textur aus. Dabei werden die drei Arrays MapX (X-Wert), MapY (Y-Wert) und MapTex (Textur) befüllt. Sie haben grundsätzlich alle drei die gleiche Länge. Am Ende wird noch die Kartengröße berechnet und in MapWidth und MapHeight gespeichert.
Dass alle Arrays die gleiche Länge haben erleichtert das Zeichnen extrem, ich kann einfach ein Array nehmen und von diesem auf die anderen schließen. Ich sehe keinen Grund dafür: Wieso wird nur der erste Eintrag der Datei und somit der Arrays gezeichnet ? Seht ihr einen Grund dafür ?
Hallo,
ich kann zwar nicht wirklich sagen, weshalb das nicht gezeichnet wird, aber ich hätte das sowieso komplett von Grund auf anders programmiert.
Folgender Vorschlag sollte eigentlich Recht in Ordnung sein, dann hättes du beim Auslesen auch nicht soviel Auswertearbeit und deine Mapdateien bleiben kleiner:
Ich habe bei meinem Game ein zweidimensionales statisches Array mit 32x24 Feldern genommen (1 Feld = 1 Tile = 32x32px = 1024x768px insg. ) und weise jedem Feld im Mapeditor die ID für die Textur zu. Beispielsweise würde in MapArray[0][0] dann 1 stehen, was dann den Boden darstellen würde. Dazu habe ich zuerst den MapEditor programmiert, der mir eben entsprechend mein Array füllt und habe das komplette Array dann per Stream mit
Code:
f.Write(MapArray,sizeof(MapArray));
in eine Datei gespeichert. Somit hättest du deine Mapdaten nicht im Klartext in der Datei stehen und du müsstest auch nicht jedesmal den kompletten Pfad zu Textur mit reinschreiben -> Platz gespart (sind zwar nur ein paar Byte, aber es kann sich letztendlich doch noch summieren )
Beim Starten des Spiels lese ich das Array wieder mit
Code:
f.Read(MapArray,sizeof(MapArray));
ein und schon ist das Array gefüllt und das Zeichnen kann losgehen.
(Ich passe die UV-Werte je nach Texture-ID an, weil ich mehrere Sprites in einer Datei habe).
Ich denke mal, dass dieser Weg einfacher und schneller sein sollte, als deiner. Und funktionieren wirds anschließend mit Sicherheit auch. Falls du jedoch von der Idee nichts wissen willst: einfach den Post ignorieren
Im Anhang siehst du noch ein Bild von meinem MapEditor. Links erkennst du bei den Sprites die roten Zahlen. Jeder dieser Zahl steht für eine Texture ID und wird dann eben entsprechend in der Position im Array eingetragen, in der sich gerade der Cursor befindet.
So, hoffe ich konnte behilflich sein. Wie gesagt, falls du bei deiner Methode bleiben willst ignorier diesen Post und warte, bis jemand anders helfen kann. gruß
Spessi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Das ist ja recht interessant, aber kann es sein, dass bei dir eine Karte auch wegen dem Rendervorgang nur eine bestimmte Größe haben darf ? Das wollte ich nämlich eigentlich verhindern, denn ich will nicht ständig Karten nachladen. Die Idee mit den Indizes ist an sich recht gut.
Hallo,
ja, meine Maps haben immer eine feste Größe von 32x24 Tiles (Quasi "fullscreen" 1024x768px). Folgedessen musst du die Maps eben entsprechend nachladen, sobald dein Charakter außerhalb des Bildschirmrandes ist. Ich erstelle dann für die Maps eine Indexdatei, in dem ich schreibe, wo welche Map ist (ein Array). Durch das Array lokalisiere ich In-Game den Charakter und kann somit problemlos nen Mapwechsel hervorrufen. Im Anhang kannst du sehen, wie meine Maps aneinandergereiht sind. Jede Map wird eben dynamisch nachgeladen, sobald der Spieler über den Rand tritt. Ist vermutlich nicht die eleganteste Lösung, aber für meine Verhältnisse tut sie's.
Aber eigentlich sollte das ganze auch mit dynamischen Arrays und nen bissl Code für's Scrollen der Map funktionieren. Musst dann halt deinen Map-Editor entsprechend anpassen. Sprich: Größe der Map beim Erstellen einer neuen Map gleich festlegen (setlength(array,width,height);) und width und height (am besten als byte oder smallint) an den Anfang deiner Map Datei, wenn du speicherst, schreiben. Somit hättest du in den ersten 2 Bytes (sofern du Datentyp byte nutzt) die Breite und Höhe deines Arrays. Das liest du beim Auslesen deines Games wieder aus, weist deinem dynamischen zweidimensionalen Array ebenfalls wieder mit setlength die Werte zu und lässt das Array eben füllen.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.