Registriert: So Jun 01, 2008 16:06 Beiträge: 31 Wohnort: Nürtingen
Okay, das mit Hex war erst ne Vermutung, weil eben die Ziffern 0-9 den Byte-Wert 0-9 + 48 haben. Ich befürchtete, dass es der Hex-Wert ist. Mit dem Dec-Wert komme ich gut aus ^^
An sich sind txt-Dateien ganz gut. Ich hab mir jetzt einen Hexeditor geholt, mache die ersten 2 Bytes zu den Werten von Mapbreite und Maphöhe. Dann Zeilenumbruch (2 Bytes; 0A, 0D = 10, 13) und ab da ist die 1. Mapzeile, Zeilenumbruch, die 2. Mapzeile etc.
Irgendwie klappt es bei mir nicht, das richtig auszulesen.
Ich brauche 12x10 Tiles.
(inetwa, weil der echte Code soviele x-y-Variablen hat, dass es schon fast wehtut o,o darum vereinfacht)
Code:
//beim rendern
repeat
mpos:=4+mapx+mapy*(mapbreite+2)
// 2 bytes für breite/höhe, 2 für zeilenumbruch
// mapx die position in der zeile, mapy*zeilenbreite mit umbruch
mapstream.position:=mpos
mapstream.Read(mapdata,SizeOf(mapdata));
//tile zeichnen an mapx, mapy
mapx:=mapx+1;
if mapx>=12thenbegin mapx:=0; mapy:=mapy+1;
// Bildschirm mit Tiles füllen.
// Gleichzeitig für mpos, oben, damit das nächste Tile gelesen wird.
until(mapy>10)
Was nicht tut, versteh ich nicht.. Er lädt zwar schön Tiles im ganzen Bildschirm. Ich hab auch n round drin, damit die Tiles stehen und nicht mit mir mitschweben.
Aber welche Tiles es sind ist bullshit o,o
Später hab ich was editiert, dass wenn man außerhalb der Map ist, dass das äußere Tile wiederholt wird (zb unendliches Meer). Aber es tut ned ._.
Also versteh ich das grad richtig, dass du während dem Rendern alle Daten aus nem Stream ausliest? Also das ist hier ja schon oft gesagt worden... Falls du nicht später völlig demotiviert dein Projekt aufgibst, weil 1. alles Spaghettimäßig zusammenhängt und 2. du durch solche, ich will mal sagen "fixe Ideen", Frameraten unterirdischen Niveaus bekommst, solltest du dir ganz schnell selber eine Ohrfeige geben und mal über das hier genau nachdenken. (Das mag jetzt zwar hart klingen, ist aber nur zum Guten gemeint!)
Die Lesegeschwindigkeit einer Festplatte ist durchschnittlich angegeben mit ca. 8.5ms.
Die Lesegeschwindigkeit des Arbeitsspeichers liegt im Bereich weniger Nanosekunden, ist also mehrere 100 bis 1000mal schneller.
Und zum Speicherverbrauch:
Ein Signed Integer hat eine Größe von 4 Bytes, also einen Bereich von -2^32/2 bis +2^32/2, also -2147483648 bis +2147483648.
Will man diese Zahlen als Text speichern, verbraucht man im Worst Case 11 Bytes, fast drei mal so viel.
Je nach dem, wie groß dein Projekt wird, bist du mit deiner Methode zum Scheitern verurteilt.
Ich gehe mal davon aus, dass du schon ein Paar Rollenspiele mit freier Welt gespielt hast. Die Welt ist IMMER in einzelne Bereiche unterteilt. In Guild Wars die einzelnen Gebiete, die so gesehen nichtmal fließend ineinander übergehen, in Morrowind und Oblivion die einzelnen Tiles, die jeweils nachgeladen werden. Das ist das ein sinnvolles System, in vielerlei Hinsicht. Zum einen verbraucht es nur relativ wenig Speicher, da nur die jeweilgen Models, Texturen etc. des einzelnen Tiles oder Gebiets geladen werden, diese Problemlos im Speicher untergebracht werden können, sie problemlos verändert werden können, ohne dass man die komplette Welt neu laden muss, neue Tiles problemlos im Hintergrund im separaten Thread nachgeladen und freigegeben werden können.
Du solltest, gerade bei einem solchen Projekt, deine Struktur, wie du was behandeln willst, vorher genau überdenken, und von Anfang an auf diese Struktur hinarbeiten. Stell dir mal vor, du stößt hinterher auf o.g. Problem, und du musst alles Umbauen und bist wegen der Menge nicht mal sicher, ob es sich nicht lohnt, nochmal komplett neu anzufangen (Zugegeben, diese Erfahrung muss eigentlich jeder mal gemacht haben bzw. haben die erfahrenen Programmierer hier in ihrer Anfangszeit wohl auch schon gemacht). Meinst du, du hättest dann noch die Motivation dazu?
Falls du mit Arrays, oder vllt sogar generell mit den verschieden Datentypen, wie es mir scheint, noch keine Erfahrung hast, solltest du dich darüber erst mal genau darüber informieren.
Denk mal drüber nach.
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: So Jun 01, 2008 16:06 Beiträge: 31 Wohnort: Nürtingen
Ich lese ja nicht aus der Datei und nicht als String.
Ich lese aus dem Stream, der ja hoffentlich im Arbeitsspeicher sitzt.
Orientieren tue ich mich an einem vielleicht weniger berühmtem MMORPG und dort befindet sich bis auf die 4 (bald 5) Dungeons alles in einer großen Welt.
Um den Prozessor zu schonen lade ich auch nur die Tiles, die ich brauche, um das Bild zu füllen.
Der Umfang der Weltkarte wird auch kaum so groß sein, dass der Stream den Arbeitsspeicher auf Dauer belastet.
Um die Dimension zu erklärn: atm brauche ich 12x10 Tiles. 1 Tile ist ein Zeichen einer Textdatei (die ich nicht arg anders verwende, als eine Binärdatei. Auch wenn das scheinbar bei niemandem ankommt.) Der Vorteil einer Binärdatei wären gerademal die 2 Bytes am Ende jeder Zeile, die ich aussparen würde. Aber ich finde die Visualisierung einer Textdatei eigentlich praktisch genug.. Notfalls den Hexeditor (für die Bytes, die nicht im Texteditor darstellbar sind).
Ja, vielleicht muss ich ersteinmal auf die Nase fallen. Ich BIN ein Anfänger und will mir Wissen erarbeiten, da gehören eventuelle Fehler dazu.
Registriert: So Jun 01, 2008 16:06 Beiträge: 31 Wohnort: Nürtingen
Ich hab jetzt vieles rumprobiert.
Die Datei, die ich lade bildet mit den verschiedenen Tile-Arten einen Smiley.
Der Smiley lädt. Außerhalb des Mapbereichs wird das letzte Tile wiederholt (Wasser, die beliebte, faule Lösung fast aller RPGs).
Wenn ich dann nach links oder rechts laufe, bewegt sich die Karte mit und alles tut.
Aber wenn ich nach oben/unten laufe, bewegt es sich mit und wenn die Tiles neugesetzt werden (wegen Bildschirmbeschränkung und CPUschonung) hüpft die Map und überholt mich o,o Also wenn ich nach oben gehe und die Map quasi nach unten wegschweben soll, schwebt sie nach unten und beim Sprung nach oben überholt es mich, bis es schließlich alles über/vor mir verschwindet. Nach unten ebenfalls..
Ich nehm an, das hat damit zu tun, dass OpenGL die Y-Achse, wie im Matheunterricht hat, also hoch=mehr und meine Textdatei geht ja andersrum. Dass die Zeilen von oben nach unten gelesen werden.
Aber wie soll ich die sonst auslesen? xD
Ich hab schon versucht maphöhe-y-wert zu machen. Dann steht der Smiley aufm Kopf aber wenn ich laufe passiert exakt dasselbe, wie bisher.
Also doch binär, hm? =/
Hab halt echt kein Bock die Datei im Hexeditor zu schreiben xD
Na ja. Wenn ich keine Lösung finde, frage ich hier wieder ._.
Quellcode ist noch der selbe, wie oben angegeben. Das Prinzip funktioniert zu gut, bis jetzt. Und wegen Mapgröße.. Hab mir bei den aktuellen Pokémon-Titeln was abgeguckt (was sicher auch sonst überall verwendet wird): Einfach Vierecke festlegen und jeweils beim Überschreiten der Mitte eines Vierecks die jeweils benötigten Umliegenden laden.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Du kannst dir ja eine Umwandleranwendung schreiben, die aus einer Rohtextdatei, wie du sie jetzt verwendest, eine Binärdatei macht. Das erspart dir das gewurschtel mit Hexeditoren.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.