Entwickler-Ecke

Multimedia / Grafik - Acces Violation beim Zeichnen von Array of TSimpleObject


Fighter#1 - Di 24.06.08 18:58
Titel: Acces Violation beim Zeichnen von Array of TSimpleObject
Hallo,
ich habe einen zweidimensionalen Array of TSimpleObject mit festgelegter Feldanzahl.
Es geht dabei quasi um eine Map für ein kleines Game, welche nur aus Schwarzen und Weißen Feldern besteht
Somit stehn in der Map Datei (als Textdatei auch nur 0 und 1 =) )
Ich lade mit dieser Methode die Karte aus der Datei in meine Karte. Sieht dann so aus:
So der Record in dem die Map is :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  TMap = record
    feld:Array [1..100,1..75of Boolean;
    grafiken: array [1..100,1..75of TSimpleObject;
    Name:String;
    FileName:String;
  end;

und so die Öffnen Methode:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
    function TMapHandler.LoadMap(Filename:String;var Engine:TEngine) : TMap;
    var Back:TMap;
        Datei:TSTringList;
        i:Integer;
        x:Integer;
    begin
      Back.FileName:=filename;
      Datei:=TStringliSt.Create;
      Datei.LoadFromFile(filename);
      i:=0;
      Back.Name:=Datei[i];
      for i := 1 to 75 do begin
        For x:= 1 to 100 do begin
          Back.grafiken[x,i]:=TSimpleObject.Create(Engine);
          Back.grafiken[x,i].Size.X:=10.24;
          Back.Grafiken[x,i].Size.y:=10.24;
          Back.Grafiken[x,i].Position.X:=x*10.24;
          Back.Grafiken[x,i].Position.Y:=i*10.24;

          if Datei[i][x] = '0' Then begin
            Back.grafiken[x,i].Color:=clWhite;
            Back.feld[x,i]:=false
          end
          else begin
            Back.grafiken[x,i].Color:=clWhite;
            Back.Feld[x,i]:=true;
          end;
        end;
      end;
    ShowMessage(Back.Name);

    result:=Back;
    end;


So die Methode an sich funktioniert.
ICh habe eine weitere funktion, die das ganze über den Feld Array (of Boolean) auf einem Canvas ausgibt. Das funktioniert Prima!
Nur eben, wenn ich das ganze über Fear2D Rendern möchte tuts nit!
Meine Render / Ausgabe Methode

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    procedure   TMapHandler.Render;
    var x,y : Integer;
    begin
      For y:=1 to 75 do begin
        For x:=1 to 100 do begin
          Karte.grafiken[x,y].Draw(True);
        end;
      end;
  end;


Er gibt mir eine Acces Violation zur Runtime und Borland schickt mich in die F2D_Objects in die TBasicObject.SetMatrix Procedure (Zeile 270) ...
Was könnte das heißen?
Woran kann das liegen?


Clemens L. - Di 24.06.08 21:06

Ich glaube nicht, dass es daran liegt, aber normal muss um die Draw's ein Engine.DoBegin und Engine.DoEnd stehen!


Fighter#1 - Di 24.06.08 21:10

Ahso ... aufgerufen wird die Methode natürlich zwischen dem Engine.DoBegin und Engine.DoEnd
Andere Objekte zeigt das Programm auch Problemlos an, nur diese KLasse will einfach nicht ;) ^^

Das is der momentane Aufruf der TMapEngine Klasse im Hauptprogramm :

Delphi-Quelltext
1:
2:
3:
4:
5:
    Engine.DoBegin;
      Karte.Render;
      //part ist nur ein einfacher Balken
      part.Draw(false);
    Engine.DoEnd;


Fighter#1 - Do 26.06.08 20:51

Also, ich könnt grad echt Hilfe gebrauchen;)
ich hab mir eine neue "Test" Klasse geschrieben ;) ... die sollte eigentlich wirklich nunmal tun!!
Ich versteh nicht warum sie nicht will!! Es is mir unbegreiflich...
Hier der QuellText

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
unit MapH;

INTERFACE

USES
  Windows,Classes, F2D_Core, F2D_Objects;
TYPE
  
  TMapH = class
  private
    ABild: TSimpleObject;
    feld:Array [1..100,1..75of Boolean;
  public
    Name:String;
    procedure LoadMap(Filename:String;var Engine:TEngine) ;
    constructor Create(var Engine:TEngine);
    destructor  Free;
    procedure   Render;
  end;
  implementation


    procedure TMapH.LoadMap(Filename:String;var Engine:TEngine);
    var
        Datei:TSTringList;
        i:Integer;
        x:Integer;
    begin
      Datei:=TStringliSt.Create;
      Datei.LoadFromFile(filename);
      Name:=Datei[0];
      for i := 1 to 75 do begin
        For x:= 1 to 100 do begin
          if Datei[i][x] = '0' Then
            feld[x,i]:=false
          else
            feld[x,i]:=true;
        end;
      end;
    end;

    constructor TMapH.Create(var Engine:TEngine);
    begin
     //Sand Grafik Erstellen
     ABild   :=  TSimpleObject.Create(Engine);
     with ABild do begin
       texture:='black';
       Position.X:=0;
       Position.y:=0;
       Size.X:=10.24;
       Size.y:=10.24;
       Color:=RGB(255,255,255);
       Z:=1;
     end;
    end;
    destructor  TMapH.Free;
    begin
     ABild.Free;
    end;
    procedure   TMapH.Render;
    begin
    //Erstmal wird keine Textur mitgerendert (speedUp)
     ABild.Draw(false);
    end;


    end.


Ich krieg beim Aufruf von Render die selbe Acess Violation wie bei der alten KLasse, obwohl nur ein "einfaches"


Fighter#1 - Do 26.06.08 21:19

Bitte bitte bitte bitte haut mich mal ganz stark!!
Ich hab die Map Klasse erstellt, bevor ich die Engine Instanziiert hab^^ =D
Omg... ok, bitter!
sorry für die Unnötige Speicherplatz belegung;)