Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra] Sprites lassen sich nicht platzieren (https://www.delphipraxis.net/117356-%5Bandorra%5D-sprites-lassen-sich-nicht-platzieren.html)

Diamondback2007 16. Jul 2008 14:51


[Andorra] Sprites lassen sich nicht platzieren
 
Hallo zusammen,

ich habe grade ein ziemlich merkwürdiges Problem und ich bin mir fast sicher,
dass der Fehler ein Dummheitsfehler auf meiner Seite ist.

Ich versuche grad einen Leveleditor für ein Spiel zu schreiben. Genauergesagt für ein Breakout.
Soweit kein Problem, ich speichere alle Bricks in eine Inidatei.
Doch jetzt kommt das Problem. Ich kann diese Datei nicht mehr lesen.
Sobald ich z.b. in jeder Ecke ein Brick platziere, dann speichere und wieder lade ist nur noch der in der rechten unteren Ecke da. Und zwar unabhängig davon ob das der letzte Stein im Level war oder nicht.

Ich stell euch einfach mal den Code hoch, ich hab keine Ahnung mehr wo der Fehler liegen könnte...:(

Delphi-Quellcode:
procedure TMainForm.Load;
var
  Path                       : string;
  tmpStrLst                  : TStringList;
  i                          : Integer;
begin
  New; //Spielfeld leeren
  with TOpenDialog.Create(nil) do
    begin
      Filter := 'Level|*.lvl';
      if Execute then
        begin
          Path := FileName;
          with TIniFile.Create(Path) do
            begin
              tmpStrLst := TStringList.Create;
              ReadSections(tmpStrlst);//Dektionen auslesen
              for i := 0 to tmpStrLst.Count - 1 do
                begin
                  AddBrick(ReadFloat(tmpStrLst.Strings[i], 'X', 0), ReadFloat(tmpStrLst.Strings[i], 'Y', 0),               ReadInteger(tmpStrLst.Strings[i], 'Color', 0)); //Jede Sektion öffnen und den Brick hinzufügen
                end;
              tmpStrLst.Free;
              Free;
            end;
        end;
      Free;
    end;
end;
Delphi-Quellcode:
procedure TMainForm.AddBrick(aX, aY: Double; aColor: Integer);
var
  tmp                        : TBrickEditor;
begin
  tmp := TBrickEditor.Create(AdSpriteEngine);
  tmp.Image := AdImgLst.Find('brick');
  tmp.Width := 90;
  tmp.Height := 20;
  tmp.X := aX;
  tmp.Y := aY;
  tmp.Color := aColor;
  tmp.Free;//Auch das Weglassen hier hilft nichts...
end;
Vielleicht kann mir ja jemand helfen... :(

Diamondback2007 16. Jul 2008 20:24

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
So,
also ich habe jetzt folgendes festgestellt.

Wenn ich folgenden Code habe klappt es auch nicht.
Delphi-Quellcode:
procedure TGameForm.Loadlevel;
var
  i, j                       : Integer;
  w                          : Integer;
const
  AnzahlBricksProReihe       = 10;
  BrickHeight                = 18;
begin
  Randomize;
  w := Round(Clientwidth / AnzahlBricksProReihe); //Breite der Bricks herrausfinden
  for j := 0 to 10 do //Alle Zeilen
    begin
      for i := 0 to AnzahlBricksProReihe - 1 do //Alle Spalten
        begin
          with TBrick.Create(AdSpriteEngine) do //Brick erzeugen
            begin
              Image := AdImgLst.Find('brick'); //Und Eigenschaften zuweisen
              Width := w;
              Height := BrickHeight;
              Y := j * Height;
              X := i * w;
              Color := clRed;
            end;
        end;
    end;
end;
Nun sollte eigentlich das ganze Feld links nach rechts und von oben nach unten mit Bricks gefüllt sein.
Dies funktioniert aber nicht.
Die erste Spalte und Zeile ist komplett leer.
Näheres dazu im Screenshot.
Weiß jemand was das ist? Kann man keine Objekte erzeugen, die eine Koordinate 0 hat?


EDIT:
Wenn ich
Delphi-Quellcode:
Y := 1+j * Height;
X := 1+i * w;
schreibe klappts... :?

Geht das nicht anders?

_BlackDragon_ 17. Jul 2008 08:35

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Hi.

Habs selber grad mal ausprobiert und bei mir lassen sich Sprites ohne Probleme
bei (0/0) platzieren.

Delphi-Quellcode:
...
FPlayer.X := 0;
FPlayer.Y := 0;
...
... funktioniert tadellos.

Eventuell kommen hier:

Delphi-Quellcode:
...
w := Round(Clientwidth / AnzahlBricksProReihe); //Breite der Bricks herrausfinden
...
nicht immer die Werte raus, die du gerne hättest und dann gibt's hier Probleme.

Delphi-Quellcode:
...
begin
  Image := AdImgLst.Find('brick'); //Und Eigenschaften zuweisen
  Width := w; // <-- Evtl. ist hier die Breite der Bricks immer 0 ???
  Height := BrickHeight;
  Y := j * Height;
  X := i * w;
  Color := clRed;
end;
...
Prüfe das mal...

Edit:

Jepp, ich glaube das sollte es sein:

ClientWidth: 699
Round: 70
Div: 69


Gruss

BlackDragon

Diamondback2007 17. Jul 2008 09:14

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Hmmm...
Nein, an dieser Breitenzuweisung kanns nicht liegen, im anderen Code wo ich die nicht habe klappts auch nicht.
Ich hab eigentlich auch schon Objekte bei [0;0] platziert und hatte nie Probleme...
Könnte es daran liegen, dass ich Newton mitverwende? Also das integrierte von Andorra.

_BlackDragon_ 17. Jul 2008 09:16

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Nein, Newton habe ich in meinem Test von eben auch mit eingebunden.

Aber schau noch mal in meinen letzten Post -> Edit

Gruss

BlackDragon

Diamondback2007 17. Jul 2008 09:22

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Also an irgendwelchen Round und Div Sachen kann es nicht liegen, in meinem "richtigen" Code also den um ein Level aus einer Datei zu lesen, hole ich mir einfach nur die Koordinaten... Die Breite stelle ich per Hand ein. Einfach nur eine Schleife die Alle Einträge in der Ini durchläuft und hinzufügen soll...

mimi 18. Jul 2008 16:05

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Erstmal kann man deinen code zu kürzten:
Delphi-Quellcode:
procedure TMainForm.AddBrick(aX, aY: Double; aColor: Integer);
begin
  with TBrickEditor.Create(AdSpriteEngine) do begin
    Image := AdImgLst.Find('brick');
    Width := 90;
    Height := 20;
    X := aX;
    Y := aY;
    Color := aColor;
  end;
end;
Zitat:

Wenn ich
Delphi-Quellcode: markieren
Y := 1+j * Height;
X := 1+i * w;

schreibe klappts... Confused

Geht das nicht anders?
Im Prinzip nicht. Das ganz lässt sich auch schnell erklären.
Du veränderst gleich große Objekte von einer Größe von 90X20.
Wenn du so speicherst wie es Igel in seinen Brekout Clone macht gilt folgendes:
Nehmen wir an du hast eine Breite von 640 und eine Höhe von 480.
640 div 90 = 7
480 div 20 = 24

Du hast also jetzt ein zwei 2D raster welches 7X24 große ist.
also haben die Objekte z.b. jetzt als Positions angaben:
X:2 und Y: 2
jetzt muss du einfach nur noch
X*90 und y*20 rechnen und schon hast du die genau Zeichen Position.

das geht aber nur bei gleich großen Objekten wie in deinen Fall.

Die Muhkuh 18. Jul 2008 16:07

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Wie speicherst Du das ganze denn ab?

mimi 18. Jul 2008 16:13

Re: [Andorra] Sprites lassen sich nicht platzieren
 
ich nehme einfach mal an irgendwie so:
Delphi-Quellcode:
------------
-  1       -
-  2       -
-          -
-          -
-          -
-          -
------------
So macht es aufjedenfal Igel bei seinem BreakOut Beispiel. Und drauf basiert auch meine Erklärung/Lösung für das Problem.

Die Muhkuh 18. Jul 2008 16:17

Re: [Andorra] Sprites lassen sich nicht platzieren
 
Er speichert es aber in einer Inidatei und ich würde gerne wissen, wie er es speichert, vielleicht ist ja da noch ein Fehlerchen drin.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Seite 1 von 2  1 2      

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