Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
Delphi 10.2 Tokyo Professional
|
RPGEditor - Ladeprobleme
12. Nov 2005, 17:16
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
Ach ja: Ich hoffe das hier ist die richtige Sparte.. Oder hätte das auch in Multimedia gehört ?
Michael
|
|
Zitat
|