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..75] of Boolean; grafiken: array [1..100,1..75] of 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.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..75] of 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 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 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;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!