Nachdem ich es schließlich doch noch geschafft habe das Captcha zu überwinden erstmal: Hallo!
Ich hänge zzt. an einer höchst ominösen AccessViolation fest wie sie in ähnlichem Kontext wohl schon öfter Aufgetreten ist (Suchfunktion inc.), dennoch haben mir die Lösungsvorschläge der anderen Threads nicht geholfen.
Erstmal der Code:
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:
| type TTile = class private Image: TImage; wall: boolean; occupiedByParty: boolean; occupiedByEnemy: boolean; x: integer; y: integer; Top, Left, Bot, Right: TTile; tp: boolean; public procedure ChangeWallStatus; function isWall: boolean; procedure SetImage(Picture: TPicture); procedure ChangePartyOccupation; procedure ChangeEnemyOccupation; function isOccupiedbyParty: boolean; procedure SetTop(pTile: TTile); function getTop: TTile; procedure SetBot(pTile: TTile); function getBot: TTile; procedure setRight(pTile: TTile); function getRight: TTile; procedure setLeft(pTile: TTile); function getLeft: TTile; function getX: integer; function getY: integer; procedure SetTp; function isTp: boolean; procedure InitTile(Picture: TPicture; px,py: integer); end; |
Ist meine eigene Klasse TTile in der später Bilder, Koordinaten und Infos zu den Feldern eines Spieles gespeichert werden sollen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TTileSet = class (TTile) private TileSet: Array[0..15, 0..9] of TTile; Setting: string[255]; Direction: string; public function check: TTile; procedure SaveTileToTileSet (x, y: integer; pTile: TTile); function getTileFromTileSet (x, y: integer): TTile; constructor Create (ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean); end; |
TTileSet soll die Felder, im Prinzip also das begehbare Spielfeld als solches im x*y Array TileSet speichern, der Fehler tritt jetzt im constructor auf:
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: 68:
| constructor TTileSet.Create(ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean); var i,j,k, check, tempcount, rx, ry: integer; temp: TImage;
begin
if (pSetting= 'cave') then begin
for i := 0 to 9 do begin for j := 0 to 15 do begin
ShowMessage(ExeDirection); temp.Picture.LoadFromFile(ExeDirection + 'Sprites\Tiles\Cave\cave' + inttostr(round(random(7)+1)) + '.bmp');
TileSet[j,i]:= TTile.Create; TileSet[j,i].InitTile(temp.Picture, j, i);
if (j=0) then begin TileSet[j,i].setLeft(nil); end;
if (j>0) then begin TileSet[j-1,i].setRight(TileSet[i][j]); TileSet[j,i].setLeft(TileSet[i][j-1]); end;
if (j=15) then begin TileSet[j,i].setRight(nil); end;
if (i=0) then begin TileSet[j,i].SetTop(nil); end;
if (i>0) then begin TileSet[j,i].SetTop(TileSet[i-1][j]); TileSet[j,i-1].SetBot(TileSet[i][j]); end;
if (i=9) then begin TileSet[j,i].setBot(nil); end;
end;
end;
end;
end; |
Beim ersten Zugriff auf das Array
TileSet[j,i]:= TTile.Create; gibt es einen dicken Fehler, was ich ein bisschen seltsam finde. Ich hab jetzt schon eine Weile rumgewerkelt, komischerweise funktioniert das ganze manchmal wenn ich den gleichen Code z. B. vor die Schleife stelle, allerdings kommt dann direkt die nächste AccessViolation an der nächsten Stelle an der auf TileSet zugegriffen wird. Irgendwas muss da also nicht richtig initialisiert sein, oder?
Schonmal Danke im Vorraus!