![]() |
Beste Speicherart ?
Moin :hi: ,
ich beschäftige mich gerade damit eine gute Möglichkeit zur Speicherung von Spielständen (für mein Spiel EliteHacker ![]() Jetzt meine Frage: Welche ist die beste (und einfachste) Möglichkeit Spielstände zu speichern ? Vielen Dank, |
Re: Beste Speicherart ?
Ich würde sagen das hängt davon ab was und wieviel du speichern willst. :gruebel:
MfG fR34k |
Re: Beste Speicherart ?
Eigentlich nur einen kurzen String, indem dann ein Code steht den mein Spiel zum Laden eines Levels braucht.
|
Re: Beste Speicherart ?
Ich stehe in der Hinsicht auf Streams. Kannst einfach wie in eine Riesenbockwurst alles an Material reindrücken, unabhängig von Variablentypen etc. und es dann dann beim Lesen schön der Reihe nach wieder rausziehen.
|
Re: Beste Speicherart ?
Ich denke da reicht eine einfache textdatei. Allerdings weiß ich nicht ob du ihn im Klartext in der Textdatei stahen haben willst. Da musst du dann auch noch eine Lösung finden. :zwinker:
MfG fR34k |
Re: Beste Speicherart ?
Zitat:
Was ist denn eigentlich der Unterschied zw. ini- und txt-Dateien ?? |
Re: Beste Speicherart ?
.ini hat einen strukturierten aufbau
Code:
Man kann dem Programm jetzt sagen: "Lese mir das Alter von PersonA aus" und man bekommt "89" zurückgeliefert
[PersonA]
Name=Max Mustermann Alter=89 [PersonB] Name=Hans Mustermann Alter=2 Bei Textdateien muss man eben selber parsen :P Zur Verschlüsselungen, schau mal hier in der CodeLib da müsste negaH mal eine sichere 1024 (oder wars 2048?) Bit Verschlüsselung gepostet haben! MFG Maximus |
Re: Beste Speicherart ?
Zitat:
![]() |
Re: Beste Speicherart ?
Hi,
ich bin auch Elites Meinung, an Streams ist das Gute, dass sie wenig Festplatte benötigen, und die Daten leicht dynamisch angeordnet werden können, das wäre bei .txt oder .ini Dateien schwieriger zu lösen, und sie für unwissende Computerspieler unkenntlich zu machen, dürfte auch kein Problem sein (Zahlen vertauschen, oder Werte doppelt speichern, etc). Gruß DelphiFreund //Edit1: Immer diese Tippfehler! |
Re: Beste Speicherart ?
Naja, dann müsstest du es schaffen, dass deine Daten im arbeitspeicher liegen bleiben und zwar nach dem neustart des Programms /Computers so Positioniert, dass du sie direkt wieder einlesen könntest. :)
Ne mal im ernst, die Stream müsstest du ja auch irgendwo speichern. (also warscheinlich in ner txt) :warn: Thorben |
Re: Beste Speicherart ?
Zitat:
|
Re: Beste Speicherart ?
Wer kommt auf die Idee einen Stream in einer Textdatei zu speichern, die Endung spielt ja eigentlich keine Rolle, aber ein Stream ist kein Text, du könntest eine Zahl, die du nicht als String im Stream speicherst garnicht als Textdatei lesen.
Gruß DelphiFreund |
Re: Beste Speicherart ?
Also erstmal vielen Dank für eure Antworten.
ich versuche das jetzt mal mit ner *.txt Datei zu realisieren. Zitat:
|
Re: Beste Speicherart ?
Du könntest die Daten auch hinten an die Exe dranhängen ...
|
Re: Beste Speicherart ?
Zitat:
Das hört sich jedenfalls ziemlich kompliziert an und ich glaube für mein kleines, billiges Spiel reichen Textfiles. ;) |
Re: Beste Speicherart ?
![]() Ich weis aber nicht, ob's auch geht, wenn die exe ausgeführt wird ... |
Re: Beste Speicherart ?
Zitat:
P.S. Die Dateiendung bestimmt nicht das Dateiformat |
Re: Beste Speicherart ?
Die beste und bei den meisten Spielen verwendete Methode ist nach wie vor das Speichern in einfachen Hex-Dateien via Streams.
Gruß DelphiFreund |
Re: Beste Speicherart ?
So, mit Textfiles das Speichern hab ich jetzt soweit.
Funktioniert ganz gut soweit. Also gut, DelphiFreund, da ich von Streams keine Ahnung habe, hast du mal ein kleines Beispiel ? |
Re: Beste Speicherart ?
Zitat:
Hier mal ein TFileStream Nachfahre der einen String schreiben und lesen kann.
Delphi-Quellcode:
Ach ja - Die Methoden lesen und schreiben natürlich immer ab der aktuellen Position
TFileStreamExt = class(TFilestream)
public procedure WriteStringToStream(aStr : String); function ReadStringFromStream : String; end; { TFileStreamExt } procedure TFileStreamExt.WriteStringToStream(aStr : String); var aStrLen : Integer; begin aStrLen:=Length(aStr); WriteBuffer(aStrLen,SizeOf(Integer)); WriteBuffer(Pointer(aStr)^,aStrLen); end; function TFileStreamExt.ReadStringFromStream: String; var aStrLen : Integer; begin ReadBuffer(aStrLen,SizeOf(Integer)); SetLength(Result,aStrLen); ReadBuffer(Pointer(Result)^,aStrLen); end; |
Re: Beste Speicherart ?
Jens hat schon ein Beispiel gegeben, aber hier ein Einfaches zum verstehen:
Delphi-Quellcode:
Das ist nur ein einfaches Beispiel, wenn beispielsweise eine Variable Länge des Namens, müsste beispielsweise ein Header geschrieben werden. Ich habe das ohne Delphi geschrieben, da ich es nicht installiert habe, deshalb könnte ein Fehler drinn sein.
procedure WriteSave(SavePath, PlayerName: String; LevelStatus: Byte; Money: Integer);
var Stream: TFileStream; begin Stream:= TFileStream.Create(SavePath, fmCreate); Stream.WriteBuffer(PlayerName, SizeOf(PlayerName)); Stream.WriteBuffer(LevelStatus, 1)); Stream.WriteBuffer(Money, 4)); Stream.Free; end; |
Re: Beste Speicherart ?
Ich kann dir nur
![]() Schnuper mal rein! |
Re: Beste Speicherart ?
Hallo,
dann darf natürlich auch die ![]() |
Re: Beste Speicherart ?
Machs wie ich mit einer einfachen Blowfish verschlüsselung (128). Das geht Blitzschnell und ist sicher. Den Public Key bauste einfach in die exe ein. Wenn du willst helfe ich dir dabei!
Meld dich einfach! mfg MiniKeks, Nieberle Software Solutions Admin |
Re: Beste Speicherart ?
Für kurze Strings würd ich mit der Registry arbeiten. Wobei du da aufpassen musst, dass du alles in HKEY_Current_User schreibst, weil du sonst nicht ohne Adminrechte drauf zugreifen kannst ;)
|
Re: Beste Speicherart ?
Zitat:
|
Re: Beste Speicherart ?
Zitat:
Ich glaub bei Delphi-Source.de gibt es en Quellcode um dateien zu verschlüsseln |
Re: Beste Speicherart ?
es geht so:
Delphi-Quellcode:
Also: wenn man 5 buchstaben liest oder schreibt(.Write/.Read) dann spults in der datei automatisch 5 buchstaben weiter, man braucht nicht immer mit .Seek rumspulen.
FS{tfilestream} := TFileStream.Create(FileName{string, name unter welchem die datei geschbeichert werden soll}, fmCreate);
//Text(string) speichern Buffer{string} := "text"; FS.Write(Buffer[1], SizeOf(Buffer)); //Zahl(integer) speichern //Tipp: ein integer verbraucht 4 bytes speicherplatz, wird also auf diese weise mit lediglich 4 byte speicherverbrauch gespeichert und ist mit notepad&co nicht darstellbar, schon das sürfte solche total-noobs abschrecken ;) BufferI{Integer} := 123; FS.Write(BufferI, SizeOf(Integer)); //text der variabel lang ist kann z.b. so gespeichert werde: Buffer := "Hallo. Dies ist ein Text, er kann beliebig lang sein."; {er kann natürlich net beliebig lang sein, nur 4 gigabyte groß!! ansonsten muss unten statt Integer Int64 verwendet werden, dann braucht das ganze ding mehr speicherplatz! und delphi hat glaubich auch ne maximallänge für strings oder?} BufferSize{Integer, wenn Buffer>4gb dann Int64} := Length(Buffer); FS.Write(BufferSize, SizeOf(Integer{/Int64})); FS.Write(Buffer[1], BufferSize); //hier werden also zuerst in 4 bytes die länge des strings gespeichert und dann kann er spöäter nach bedarf ausgelesen werden. //Diese methode braucht keinen Terminator und ich finds besser weil man _alle_ buchstaben speichern kann und nicht einen escapestring oder so hat. //datei schließen FS.Free; ////datei lesen FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); {buffer: struing} {buffersize: integer} //in der datei "rumspulen" - geht auch beim schreiben;) FS.Seek(0, soFromBeginning); //an anfang der datei FS.Seek(0, soFromEnd); //ans ende der datei FS.Seek(8, soFromCurrent); //8 buchstaben weiter FS.Seek(-3, soFromEnd); //3 buchstaben vorm ende FS.Seek(-12, soFromCurrent); //12 buchsteben zurück //string lesen SetLength(Buffer, 5{wie lang ist der string?}); FS.Read(Buffer[1], 5{wie lang ist der string?}); //integer lesen FS.Read(BufferI, SizeOf(Integer)); //lies die konstrkution von vorher wieder aus, also zuerst 4 bytes längenindikator, dann den string selber FS.Read(BufferSize{<-so lang ist der string}, SizeOf(Integer)); SetLength(Buffer, BufferSize); //buffer mit #0's füllen FS.Read(Buffer[1], BufferSize); //buffer auslesen //wenn man vorher In64 genommen hat muss man hier natürlich auch Int64 einsetzen! fs.free; //wenn man z.b. inner datei unbekannt viele integers speichert kann mans ja so machen alle auszulesen: while FS.Position < FS.Size do FS.Read(BufferI, SizeOf(Integer)); //mach was mit bufferI end; Tipp: dauerndes rumspulen mahcts programm langsam!! Tipp2: nemht den TMemoryStream statt den Filestream(ist genau gleich, nur dass kein dateiname angegeben werden muss)->bedienung genau gleich aber alles wird statt inner datei nur im RAM gespeichert. Es gibt ja auch noch den TZipStream(oder so ähnlich) der speichert alles glaub wie der memory stream im ram bloß er verpackts gleich mit ZIP ;) -Dominik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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