![]() |
Zugriffsfverletzung - Aber warum
Delphi-Quellcode:
Bei //Kollision Spieler und Item bekomme ich eine Zugriffsverletzung. Ich verstehe allerdings nicht warum. Genauso werden bei mir die Gegner behandelt und bei denen funktioniert es. Zudem die Gegner ja genauso erstellt werden.
procedure TForm1.Timer1Timer(Sender: TObject);
var l,k,m,n,o,AL1,AL2: Integer; begin //Kollision Spieler und Ziel if IsCollision(Spieler.BoundsRect, Ziel.BoundsRect) then begin Punktzahl:=Punktzahl+1; If Sounds='Enabled' Then begin SoundPlayer.FileName:=Pfad+'\Datein\Ziel.wav'; SoundPlayer.Open; SoundPlayer.play; end; ItemCount:=ItemCount+1; Ziel.Top:=random(Spielflaeche.Height-Ziel.Height); Ziel.Left:=random(Spielflaeche.Width-Ziel.width); Memo2.lines.add(IntToStr(Ziel.Left)+';'+IntToStr(Ziel.top)); // Gegner hinzufügen begin setLength(gegner,length(Gegner)+1); AL1 := length(Gegner)-1; Gegner[AL1]:= TGegner.Create(Self); With Gegner[AL1] do begin speed:=3; Parent := self; Cooldown := 1000; If RandomAusgabe(1)=1 Then begin Width:=7; Height:=40; top:= 250; Left := random( Spielflaeche.ClientWidth - Width ); end; If RandomAusgabe(1)=0 Then begin Width:=40; Height:=7; top:= random( Spielflaeche.clientheight - height ); Left := 450; end; end; end; //Item hinzufügen begin setLength(Item,length(Item)+1); AL2 := length(Item)-1; Item[AL2]:= TItem.Create(Self); With Item[AL2] do begin Parent:=Self; Height:=10; Width:=10; Top:=Random(Form1.ClientHeight-Height); Left:=Random(Form1.ClientWidth-Width); Brush.Color:=clblack; If RandomAusgabe(1)=1 then begin Pen.Color:=clgreen; Typ:=True; end; If RandomAusgabe(1)=0 then begin Pen.Color:=clred; Typ:=False; end; end; end; ... //Kollision Spieler und Item For n := low(item) to high(item) do begin If IsCollision(Spieler.BoundsRect,Item[n].BoundsRect) Then begin Spieler.Upgrade(n,Item[n].Typ); end; end; end; ... //Kollision Spieler und Gegner For k:= low(gegner) to high(gegner) do begin if ((IsCollision(Gegner[k].BoundsRect, Spieler.BoundsRect)) and (Gegner[k].Cooldown<=0)) then Verloren; end; ... end; Weiß jemand warum ? |
AW: Zugriffsfverletzung - Aber warum
Was ist Item, ein Array? Evtl. bist du drüber.
|
AW: Zugriffsfverletzung - Aber warum
was passiert hier?
Delphi-Quellcode:
Spieler.Upgrade(n,Item[n].Typ);
|
AW: Zugriffsfverletzung - Aber warum
Zitat:
Zitat:
Delphi-Quellcode:
procedure TSpieler.Upgrade(n: Integer; ItemTyp: Boolean);
var i,Zufall: Integer; begin Zufall:=Randomausgabe(5); If ItemTyp=True Then begin //Gutes Item If Zufall=1 Then begin Item[n].Free; If Spieler.Speed>=1 Then Spieler.Speed:=Spieler.Speed+1; AuswirkungAnzeigen('Spieler speed up');; end; If Zufall=2 Then begin Item[n].free; //For i:= 0 to high(gegner)-1 do //begin //If Gegner[i].Speed>=2 Then Gegner[i].Speed:=Gegner[i].Speed-1; //end; AuswirkungAnzeigen('Gegner speed down'); end; If Zufall=3 Then begin Item[n].Free; AuswirkungAnzeigen('Nichts1'); end; If Zufall=4 Then begin Item[n].Free; AuswirkungAnzeigen('Nichts2'); end; If Zufall=5 Then begin Item[n].Free; AuswirkungAnzeigen('Nichts3'); end; end; If ItemTyp=false Then begin //schlechtes Item If Zufall=1 Then begin Item[n].Free end; If Zufall=2 Then begin Item[n].Free end; If Zufall=3 Then begin Item[n].Free end; If Zufall=4 Then begin Item[n].Free end; If Zufall=5 Then begin Item[n].Free end; end; end; procedure AuswirkungAnzeigen(Auswirkung: String); begin Form1.ItemAnzeige.Caption:=Auswirkung;; Form1.Timer2.Enabled:=true; end; function RandomAusgabe(max: Integer): Integer; begin Randomize; Result:=Random(max+1); end; |
AW: Zugriffsfverletzung - Aber warum
Item[n].Free gibt das Item frei. Jeder nachfolgende Zugriff darauf führt zu einer Zugriffsverletzung. Da das Array aber nicht verändert wird, ist das Item noch da (obwohl keine gültige Objekt-Instanz dahinter liegt) und wird beim nächsten Schleifendurchlauf wieder angesprochen.
|
AW: Zugriffsfverletzung - Aber warum
Das heißt visible auf false setzen und noch eine Enabled eigenschaft einbauen ?
Edit: Ich werde jetzt erstmal schlafen gehen. Aber das mit visible auf False und enabled sollte dann ja funktionieren. Danke für eure Hilfe ;D |
AW: Zugriffsfverletzung - Aber warum
Das zu beurteilen wage ich ob des mangelnden Verständnisses um die gewünschte Funktion nicht.
gegf. ist es erwünscht Item freizugeben dann muss allerdings sichergestellt werden daß bei Item[n].Free; Item[n] überhaupt noch existiert (gegf. FreeAndNil,TObjectlist(oder verwaltete TList) statt Array) ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz