AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Items in einem RPG speichern?

Ein Thema von Master_RC · begonnen am 17. Mai 2005 · letzter Beitrag vom 19. Mai 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#11

Re: Wie Items in einem RPG speichern?

  Alt 17. Mai 2005, 19:15
Zitat von Master_RC:
k, ich hab gerade von alcaeus ein tuto bekommen, elches ich mir erst durchlese
Bevor Fragen auftauchen warum ich es nicht hier gepostet habe, erklaere ich es: ich arbeite noch dran (es ist ein Collection-Tutorial), und ich habe es ihm nur geschickt, weil er es relativ dringend braucht. Nach meinem Urlaub werde ich es so schnell wie moeglich hier posten

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#12

Re: Wie Items in einem RPG speichern?

  Alt 19. Mai 2005, 10:13
nochmal zu dem dingen "Stream(s)" ...
kurzgesagt 'n Stream isn "Strom" an/von Daten ... kann man jeweils als Lesestrom oder als Schreibstrom betrachten, je nachdem wie man es braucht...

naja und wie man die Items in so einem Stream verstaut (und später vllt auch in einer Datenbank - innem blob oder so)
schreib ich dir mal eben hier hin

Delphi-Quellcode:
TItem = record
     name: string; // Der Name des Items
     kind: string; // Der Typus des Gegenstandes
     picture: string; // Bild des Gegenstandes
     { ... die ganzen integer teile hier ... }
     onlytype: string; // Für charakterspezifische Gegenstände
     special1: string; // evtl. Spezial-Sache des Gegenstandes
     special2: string; // evtl. Spezial-Sache des Gegenstandes
    end;
um platz in der späteren datei zu sparen hab ich aus den string[255] (das währen ja für jeden string jedesmal 256 zeichen) ein einfachen string gemacht, die lade & speicher "routinen" kümmern sich automatisch um deren größe...

Delphi-Quellcode:
procedure SaveStringToStream(xStream: TStream; const sText: string);
begin
{
  länge des nachfolgenden strings speichern,
  4 = SizeOf(Integer) = Anzahl an Bytes die ein Integer im Speicher "verbraucht"
}

  xStream.Write(Length(sText), 4);
  xStream.Write(sText[1], Length(sText));
{
  oder xStream.Write(Pointer(sText)^, Length(sText));
}

end;

procedure LoadStringFromStream(xStream: TStream; var sText: string);
var
  iLength: integer;

begin
// länge des nachfolgenden strings wieder auslesen
  xStream.Read(iLength, 4);
// länge des texts setzen
  SetLength(sText, iLength);
// und letztendlich den text aus dem stream lesen
  xStream.Read(sText[1], iLength);
// oder wieder xStream.Read(Pointer(sText)^, iLength);
end;

procedure SaveItem(const sFileName: string; xItem: TItem);
var
  xMS: TMemoryStream;

begin
  xMS := TMemoryStream.Create;
  with xItem do begin
    SaveStringToStream(xMS, name);
    SaveStringToStream(xMS, kind);
    SaveStringToStream(xMS, picture);
    xMS.Write(XYZ, 4); // < XYZ steht für alle deine xItem items vom typ integer, ich war zu faul hier alle hinzuschreiben :)
    SaveStringToStream(xMS, onlytype);
    SaveStringToStream(xMS, special1);
    SaveStringToStream(xMS, special1);
  end;
  xMS.SaveToFile(sFileName);
  FreeAndNil(xMS);
end;

function LoadItem(const sFileName: string; xItem: TItem): boolean;
var
  xMS: TMemoryStream;

begin
  Result := False;
  if not FileExists(sFileName then
    Exit;
  xMS := TMemoryStream.Create;
  xMS.LoadFromFile(sFileName);
  with xItem do begin
    ReadStringToStream(xMS, name);
    ReadStringToStream(xMS, kind);
    ReadStringToStream(xMS, picture);
    xMS.Read(XYZ, 4); // < XYZ steht für alle deine xItem items vom typ integer, ich war zu faul hier alle hinzuschreiben :)
    ReadStringToStream(xMS, onlytype);
    ReadStringToStream(xMS, special1);
    ReadStringToStream(xMS, special2);
  end;
  FreeAndNil(xMS);
  Result := True;
end;
was noch ginge, wenn du dein record so belässt wies war also du die strings mit string[von 0 bis 255 irgendwas] definierst (oder halt mit shortstring wie alceus bemerkt hat

kannst dein Item mit noch weniger code speichern

Delphi-Quellcode:
procedure SaveItem(const sFileName: string; xItem: TItem);
var
  xMS: TMemoryStream;

begin
  xMS := TMemoryStream.Create;
  xMS.Write(xItem, SizeOf(xItem)); // SizeOf(xItem) = 15 * SizeOf(Integer) = 15 * 4 = 60 ... + 6 * SizeOf(shortstring) = 6 * 256 = 1536 = 60 + 1536 = 1596 Bytes ... deine Datei müsste also 1596 Bytes PRO Item belegen, wenn ich mich jetz nich verrechnet hab
  xMS.SaveToFile(sFileName);
  FreeAndNil(xMS);
end;

function LoadItem(const sFileName: string; xItem: TItem): boolean;
var
  xMS: TMemoryStream;

begin
  Result := False;
  if not FileExists(sFileName) then
    Exit;
  xMS := TMemoryStream.Create;
  xMS.LoadFromFile(sFileName);
  xMS.Read(xItem, SizeOf(xItem));
  FreeAndNil(xMS);
end;
hoffe das hat ein wenig geholfen
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#13

Re: Wie Items in einem RPG speichern?

  Alt 19. Mai 2005, 10:18
achja nochwas...
falls es einige stört das ich TMemoryStream verwende (solche Leute soll es ja geben)
man kann auch JEDEN andere Streamklasse benützen, oder man stellt sichs auf windoww.FileWrite/Read um oder BlockRead/Write ... wie auch immer...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz