Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   RPGEditor - Ladeprobleme (https://www.delphipraxis.net/56875-rpgeditor-ladeprobleme.html)

Neutral General 12. Nov 2005 17:16


RPGEditor - Ladeprobleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich habe einen Editor für mein Rollenspiel programmiert. Das Laden und speichern klappt eigentlich soweit - bei kleinen Maps. Wenn die Maps etwas größer sind werden die Maps nicht richtig geladen.. Abgespeichert werden sie glaube ich richtig...

Neue Map:

Delphi-Quellcode:
procedure TEditWorld.New(Width:Integer; Height:Integer); //TEditWorld = class(TWorld)
var x,y,i : Integer;
begin
 i:= 0;
 Textures.Clear; // TTextureList = class(TObjectlist)
 World.Engine.Engine.Clear; //Engine = TDXSpriteEngine
 World.LWidth := Width;
 World.LHeight:= Height;
 if FLevel <> nil then FLevel.Free; //FLevel = TBiginifile
 DeleteFile(ExtractFilePath(Application.Exename) + 'Default.rpm');
 FLevel := TBigIniFile.Create(ExtractFilePath(Application.Exename) + 'Default.rpm');
 FLevel.WriteInteger('Count','Count',Width*Height); //Anzahl der Tiles
 for y:= 0 to Height-1 do begin
  for x:= 0 to Width-1 do begin
    inc(i);
    FLevel.WriteString('Tex' + IntToStr(i),'Tex','Wasser'); //Textur
    FLevel.WriteInteger('Tex' + IntToStr(i),'x',x);        //x-
    FLevel.WriteInteger('Tex' + IntToStr(i),'y',y);        //y-Wert Schreiben
  end;
 end;
 FLevel.FlushFile; //Ini speichern
 LoadFromFile(ExtractFilePath(Application.Exename)+ 'Default.rpm'); //Level laden
end;
Map laden:
Delphi-Quellcode:
procedure TWorld.LoadFromFile(Filename: String);
var i: Integer;
    Count: Integer;
    Tex: TTexture;
    xW,yW: Integer; //Breite und Länge der Welt
begin
  xW:= 0;
  yW:= 0;
  Textures.Clear;
  Engine.Engine.Clear;
  FLevel := TBigIniFile.Create(Filename);
  Count := FLevel.ReadInteger('Count','Count',0);
  for i:= 1 to Count do begin
   Tex:= TTexture.Create(Engine.Engine,ImageList.Items.Find(FLevel.ReadString('Tex' + IntToStr(i),'Tex','')));
   with Tex do begin
    x:= FLevel.ReadInteger('Tex' + IntToStr(i),'x',0) *32; // x, y Koordinaten auslesen
    y:= FLevel.ReadInteger('Tex' + IntToStr(i),'y',0) *32;
    xW:= (Round(x) div 32)+1; //Länge
    yW:= (Round(y) div 32)+1; // Breite
   end;
   Textures.Add(Tex); //Textur zur Texturliste adden
  end;
  LWidth:= xW;
  LHeight:= yW;
end;
end.
Texturen "malen" :

Delphi-Quellcode:
procedure TEditWorld.DXDrawClick(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Sprite: TImageSprite;
    x1,y1,i: Integer;
    Tex: TTexture;
begin
  if ((x div 32) < World.LWidth) and ((y div 32) < World.LHeight) then begin // Wenn man nicht außerhalb klickt
   Sprite:= TImageSprite(World.Engine.Engine.GetSpriteAt(x,y));
   i:= GetTexNum(Sprite); // Position in der Texturenliste
   Sprite.Free;
   x1:= x;
   y1:= y;
   Tex := TTexture.Create(World.Engine.Engine,World.ImageList.Items.Find(World.Texture));
   with Tex do begin
    x:= (x1 div 32) * 32;
    y:= (y1 div 32) * 32;
    x1:= Round(x) div 32;
    y1:= Round(y) div 32;
   end;
   FLevel.WriteInteger('Tex' + IntToStr(i),'x',x1);
   FLevel.WriteInteger('Tex' + IntToStr(i),'y',y1);
   FLevel.WriteString('Tex' + IntToStr(i),'Tex',World.Texture);
   FLevel.FlushFile; //Änderungen in Ini schreiben
  end;
end;
Speichern:

Delphi-Quellcode:
procedure TForm1.Mapspeichern1Click(Sender: TObject);
var SL: TStringlist;
begin
  if SaveDialog1.Execute then begin // dürfte sich alles von selbst erklären hier
   SL:= TStringList.Create;
   SL.LoadFromFile(ExtractFilePath(Application.Exename) + 'Default.rpm');
   if pos('.rpm',SaveDialog1.Filename) > 0 then begin
   SL.SaveToFile(SaveDialog1.FileName);
   World.Filename:= SaveDialog1.FileName;
   end
   else begin
   SL.SaveToFile(SaveDialog1.FileName + '.rpm');
   World.Filename:= SaveDialog1.FileName + '.rpm';
   end;
   SL.Free;
  end;
end;
Laden:

Delphi-Quellcode:
procedure TForm1.Mapffnen1Click(Sender: TObject);
begin
  if Opendialog1.Execute then
  World.LoadFromFile(Opendialog1.Filename);
end;
Ok das war jetzt viel Code. Ich habe noch den Editor selber angehangen damit ihr den Fehler nachvollziehen könnt und nicht nur einen Haufen Quelltext habt :mrgreen:

Ach ja: Ich hoffe das hier ist die richtige Sparte.. Oder hätte das auch in Multimedia gehört ?

Xcessive_ 13. Nov 2005 10:48

Re: RPGEditor - Ladeprobleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Also hab' gerade mal den Editor getestet und konnte deinen Fehler leider nicht nachvollziehen :roll:

Mir ist aber ein anderer Bug aufgefallen: Wenn ich auf der linken Seite eine Textur auswähle und dann rechts irgendwo reinklicke um die Textur dann zu platzieren, tauchen manchmal nur schwarze Blöcke auf (siehe Attachment).

Und warum wechselst du beim starten des Programms die Bildschirmauflösung? Ich dachte erst mein Rechner wäre abgeschmiert und jetzt käm ein Bluescreen :freak: Wäre schön, wenn du nur eine "normale" Windows Applikation schreiben würdest die wie jedes andere Fenster auch angepasst werden kann und nicht direkt den ganzen Bildschirm belegt. Schaut auch nebenbei schöner aus :)

Auch schön wäre wenn die Buttons sich "reindrücken" lassen würde, damit ich nicht immer unten in die Statusleiste schauen muss, um zu wissen ob die Textur jetzt ausgewählt wurde.

Ich hoffe ich konnte dir ein wenig helfen.

Neutral General 13. Nov 2005 12:34

Re: RPGEditor - Ladeprobleme
 
Den Bug den du beschrieben hast den kannte ich schon. Aber der war im Gegensatz zu dem Ladebug eher nachrangig.. Das mit dem reindrücken und mit der normalen Windows-Application werde ich noch einrichten ;)

Und du konntest wirklich auch größere Maps speichern und ohne probleme laden ??

3_of_8 13. Nov 2005 12:42

Re: RPGEditor - Ladeprobleme
 
50x50 dauert bei mir etwa 3 Sekunden. Aber ich habe noch weitere Bugs gefunden:

Wenn man eine Karte erstellt, und dann nochmal eine neue erstellt, kriegt man ne AV. Und es wäre nützlich, wenn du es so machen würdest, das man mit einem Klick und dann über die Felder drüber ziehen die Texturen drauftuen könnte, und nicht für jedes Feld einzeln klicken muss. Auch Füllwerkzeuge wären sehr nützlich.

Neutral General 13. Nov 2005 12:45

Re: RPGEditor - Ladeprobleme
 
Zitat:

Zitat von 3_of_8
50x50 dauert bei mir etwa 3 Sekunden. Aber ich habe noch weitere Bugs gefunden:

Wenn man eine Karte erstellt, und dann nochmal eine neue erstellt, kriegt man ne AV. Und es wäre nützlich, wenn du es so machen würdest, das man mit einem Klick und dann über die Felder drüber ziehen die Texturen drauftuen könnte, und nicht für jedes Feld einzeln klicken muss. Auch Füllwerkzeuge wären sehr nützlich.

also "man" bekommt keine AV. Ich bekomme keine.. Ich kann 10 Maps hintereinander machen und kein Fehler :gruebel:
Ja das mit dem füllen und das man nicht jedes Feld einzeln anklicken muss kommt noch. Es geht mir ja nur um den einen Fehler beim Laden. Wenn ich insgesamt Verbesserungsvorschläge haben wollte hätte ich das in Freeware gestellt ;)

3_of_8 13. Nov 2005 12:57

Re: RPGEditor - Ladeprobleme
 
Wenn das so lange dauert beim Laden, welchen PC hast du? Einen Pentium 100?

Neutral General 13. Nov 2005 13:05

Re: RPGEditor - Ladeprobleme
 
Ich ? Ich hab gar nicht gesagt das das bei mir lange dauert ?!

3_of_8 13. Nov 2005 13:06

Re: RPGEditor - Ladeprobleme
 
Ahja, jetzt sehe ich es. Du sagtest, es geht nicht richtig.

Irgendwie treten bei jedem Fehler auf: Doch es sind nie die gleichen. Wie kann das denn gehen?

Neutral General 13. Nov 2005 14:27

Re: RPGEditor - Ladeprobleme
 
Also die Sache ist geklärt. Ich habs jetzt mit FileStreams gemacht :)

3_of_8 13. Nov 2005 14:35

Re: RPGEditor - Ladeprobleme
 
Und wie hast dus davor gemacht? Mit assignfile und readln?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz