![]() |
Das Laden eines Levels dauert zu lange
Liste der Anhänge anzeigen (Anzahl: 1)
Das Laden eines Levels dauert zu lange
Habe die Datei angehängt. Dann kann man gleich mitschauen, was ich meine. (Delphi 4) Habe einen Leveleditor gebaut, der das Level dann als Textdatei abspeichert. Er schreibt nur das in die Textdatei, was man auch wirklich sieht. Hintergrund oder so wird nicht reingeschrieben. Nach Fertigstellung einer Probemap speichere ich das Level. Es funktioniert alles. :thuimb: Nun öffne ich mein Spiel und das Fenster, mit dem man die Textdatei öffnen kann, öffnet sich. Wenn man nun die Datei heruntergeladen hat, erkennt man sofort, was mein Problem ist. Für die, die die Datei nicht heruntergeladen haben, versuche ich das Problem zu erläutern :gruebel: : ![]() So ca. ist das Level aufgebaut. Man ist in der Mitte fixiert und die "Umgebung" bewegt sich. Das ganze map besteht aus "Kästchen", die eine Grösse von 32x32 haben. Für eine map von 50x50 erkennt man noch nicht richtig ein Problem, doch ist die map 200x200 gross, dauert das laden schon ziemlich lange, obwohl ich einen sehr neuen Computer habe. Bei 1000x1000 gibt es keine chance mehr, das level zu laden. Doch das endgültige Spiel sollte dann um die 10000x10000 Kästchen besitzen (Ob das wirklich so gross werden wird, weiss ich nicht, aber es sollte bis zu dieser Grösse noch ruckelfrei gehen). Das Problem liegt am maxx und maxy. Dort wird die Anzahl der Kästchen eingetragen (zB. 200x200 (siehe oben)). Wenn ich nun das level mit 2 for-schleifen lade, dann sieht das so aus:
Code:
Dort wird dann die x und y Position des Busches, der Strasse, etc. festgelegt. Um so grösser maxx und maxy sind, umso länger dauerts beim laden und umso ruckeliger geht es
for i:=0 to Maxx do
begin for j:=0 to Maxy do begin Ich weiss nicht, wie ich das erklären bzw. besser erklären kann. Am Besten ist es, die Datei donwloaden und selber nachschaun. Einfach nur dort nachschaun, wo i,j,maxx und maxy. Dort muss es irgendwo liegen. PS: Man muss die mitgelieferte Textdatei öffnen :zwinker: |
Re: Das Laden eines Levels dauert zu lange
Hi,
ich würde mir über den Aufbau der Level Datei gedanken machen. Du könntest unter anderem mehrere Elemente zusammenfassen. Also z.B. [field] RangeX=0::10 RangeY=1::14 typ=4 [/field] Das muss jetzt nicht genau aussehen, aber da würdest du erstmal die Datei kleiner kriegen. Jedoch würde dadurch deine Einlese-Algorithmus komplizierter werden. Eine andere Möglichkeit wäre irgendwie die Größe der Texturen zu erhöhen. mfG mirage228 |
Re: Das Laden eines Levels dauert zu lange
Es liegt ja nicht an der Textdatei.
Egal, ob die Datei nur 10 Zeilen oder 100 enthält. Es kommt auf die Grösse von maxx und maxy an. :wink: Über das kann ich mir dann gedanken machen, wenns funktioniert. Aber trotzdem danke :P |
Re: Das Laden eines Levels dauert zu lange
Hi ISAS,
warum speicherst du den Level in einer txt-Datei? Erstell doch einfach einen Datentyp TLevel oder so, der einen Array enthält mit den Nummern für die Kacheln. Und den kannst du dann speichern mit einem
Delphi-Quellcode:
Dann kannst du den Level mit einem einzigen Befehl laden.
file of TLevel
Das sollte auf jeden Fall schneller gehen. Grüße Seniman |
Re: Das Laden eines Levels dauert zu lange
Das hört sich nicht schlecht an, sogar ziemlich gut.
Nur leider hab ich keine Ahnung, wie sowas geht. :gruebel: Also jedem 32x32 grossem Feld eine Nummer geben. Das wären bei 500x500 Feldern 250000 Felder. Sind ziemlich viele. Kann mir bitte jemand schreiben, wie das geht. Muss nicht die Lösung sein, sondern nur ein Quellcode mit einem anlichen Beispiel. Es ist für mich am leichtesten, weil ich das meiste von Quellcodes gelernt habe. |
Re: Das Laden eines Levels dauert zu lange
Hallo ISAS,
das mit dem Laden und Speichern könnte so funktionieren: Erst brauchst du einen Datentyp, der alle Informationen enthält, die ein Level/eine Karte braucht. z.B. so:
Delphi-Quellcode:
Es gibt allerdings eine Einschränkung: Es dürfen keine dynamischen Arrays und keine Strings ohne Begrenzung vorkommen.
type
TLevel = record Kachel: Array [1..500,1..500] of Integer; //Hier sind die Nummern der einzelnen Kacheln des Hintergrunds!! Autor: String[100]; Beschreibung: String[100]; end; Zum Laden und Speichern machst du folgendes:
Delphi-Quellcode:
Was die einzelnen Befehle (AssighnFile, Reset, Read, Write und Closefile) bringen liest du am besten in der OH nach.
function LevelLaden(Dateiname: String):TLevel;
var Datei: File of TLevel; begin AssignFile(Datei,Dateiname); if FileExists(Dateiname) then begin Reset(Datei); Read(Datei,Result); CloseFile(Datei); end else begin //falls Datei nicht existiert. end; end; Procedure LevelSpeichern(Level: TLevel;Dateiname: String); var Datei: File of TLevel; begin AssignFile(Datei,Dateiname); ReWrite(Datei); Write(Datei,Level); CloseFile(Datei); end; Nun kannst du einen Leveleditor schreiben und dort Levels bauen. Diese kannst du dann mit "LevelSpeichern" speichern und dann im Spiel mit "Levelladen" laden. Ich hoffe, das hilft dir weiter! Grüße Seniman |
Re: Das Laden eines Levels dauert zu lange
Hallo
Wer sagt denn dass du alle Felder laden musst? Du musst ja nur die Laden, die man sieht und am Besten eine Reihe noch dazu. Wenn man sich bewegt lädst du einfach noch eine und gibst hinten eine Frei. Was glaubst du was 1000² Reihen den RAM belasten? Gruß |
Re: Das Laden eines Levels dauert zu lange
Zitat:
Delphi-Quellcode:
Gruß
type
TLevel = packed record Kachel: Array [1..500,1..500] of Integer; //Hier sind die Nummern der einzelnen Kacheln des Hintergrunds!! Autor: String[100]; Beschreibung: String[100]; end; Onz |
Re: Das Laden eines Levels dauert zu lange
Da ich leider nicht so gut in Delphi bin, komm ich da nicht weiter mit den Quellcodes.
Hab noch nie was von File of gehört. :pale: Aber ich habe eines sehr guten Vorschlag von einem Freund bekommen. Der hatte folgende Idee :idea: : Eine gespeicherte Txtdatei sieht so aus: [1_0] Typ=2 [2_4] Typ=2 Das Laden einer txtdatei befindet sich in 2 FOR-Schleifen, die für die X und Y Koordinaten verantwortlich sind. Es fängt mit [0_0] an, geht dann weiter mit [0_1], [0_2], [0_3] und so weiter. Damit muss er jedesmal die Textdatei nach diesen Kordinaten durchsuchen. Wenn das Map zB. 100x100 Felder ( [100_100] ) gross ist, dann dauert das ja ziemlich lange, da er 100² mal die Textdatei durchsuchen muss. :cry: So, nun war der Vorschlag meines Freundes dieser: :arrow: Ich könnte statt: [1_0] Typ=2 [2_4] Typ=2 -------> [Busch] (Wäre Typ=2) 1_0 (Kordinaten X und Y) 2_4 (Kordinaten X und Y) So gibt es nur eine FOR-Schleife und wenn er Busch fertig hat, überspringt er Busch und geht zum nächsten zB. Baum und so weiter :cyclops: . Nur keine AHnung wie das gehen soll. das mit dem 1 Fall hab ich zusammengebracht. Nämlich so:
Delphi-Quellcode:
begin
for i:=0 to Maxx do begin for j:=0 to Maxy do begin steine[i,j].typ:=Data.readInteger(IntToStr(i)+'_'+IntToStr(j),'typ',0); end; end; Und dann soll er es malen (das brauch ich nicht hinschreiben) |
Re: Das Laden eines Levels dauert zu lange
Hallo ISAS,
oder probier es so: Du schreibst, statt für jedes Feld soetwas wie [1_0] Typ=2 zu schreiben, einfach nur die 2 hin. Daneben dann den Typ von dem Feld 2_0 usw. d.h. du schreibst die Typen der einzelnen Felder hin, ohne anzugeben welches Feld diesen Typ hast. Dadurch, dass du die Felder aber in der Reihenfolge "von links nach rechts und von oben nach unten" in die Datei schreibst, kannst du trotzdem ermitteln, welches Feld gemeint ist. Die Datei sähe dann hinter von innen etwa so aus: 2 2 2 2 1 1 2 1 2 2 2 1 2 2 1 2 ... usw. Ich hoffe ich habe mich klar genug ausgedrückt. Grüße Seniman |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz