![]() |
debugger Exception - pacman macht probleme
Tag alle zusammen!
Ich hab ein kleines Problem mit nem Programm. Ich bekommen eine "Benachrichtung über Debugger-Exception" und weiß echt nicht wieso. Das Programm soll Blöcke anzeigen und einen gelben kreis der sich darin bewegen kann - soll nachher mal so ähnlich wie pacman werden. Bei
Delphi-Quellcode:
(ganz unten im ontimer ereignis)
for i:=1 to high(block) do showblock(i);
gibts diesen Fehler, blau markiert ist dann die zeile
Delphi-Quellcode:
in tblock.show.
rectangle(bx,by,bx+21,by+21);
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type tspieler=class(Tobject) x,y:integer; procedure show; procedure bewegen(dir:string); end; tblock = class(TObject) bx,by:integer; da:boolean; procedure show; end; TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure malelevel(r:integer); procedure Timer1Timer(Sender: TObject); end; var Form1: TForm1; block:array of Tblock; level:array[1..14] of string; spieler:Tspieler; implementation {$R *.dfm} procedure Tspieler.show; begin form1.Image1.Canvas.Brush.color:=clyellow; form1.Image1.Canvas.Ellipse(x-8,y-8,x+8,y+8); end; procedure Tspieler.bewegen(dir:string); begin if (dir='links') then dec(x,5); if (dir='rechts') then inc(x,5); if (dir='oben') then dec(y,5); if (dir='unten') then inc(y,5); end; procedure Tblock.show; begin with form1.image1.Canvas do begin brush.color:=clskyblue; rectangle(bx,by,bx+21,by+21); end; end; procedure Tform1.malelevel(r:integer); var i,k:integer; begin if r=1 then begin level[1]:= 'xxxxxxxxxxxxxxxxxxxx'; level[2]:= 'x xxxx xx'; level[3]:= 'x xxx x x xx'; level[4]:= 'x x xx'; level[5]:= 'x xx x xxx xx xx'; level[6]:= 'x xx x xxx xx xx'; level[7]:= 'x xx x xxx xx xx'; level[8]:= 'xxxxx xxxxxxx xx'; level[9]:= 'xxxxxx xxxxxxxxxxxxx'; level[10]:= 'xx xxxxxx'; level[11]:= 'xxx xx xxxxxxx'; level[12]:= 'x xxxxxxx x'; level[13]:= 'xxxxxxxxxx xxxx'; level[14]:= 'xxxxxxxxxxxxxxxxxxxx'; end; setlength(block,high(level)*length(level[1])); for k:=1 to high(level) do for i:=1 to length(level[k]) do begin block[i]:=tblock.Create; block[i].bx:=i*20; block[i].by:=k*20; if level[k][i]='x' then block[i].da:=true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin spieler:=Tspieler.Create; malelevel(1); spieler.x:=100; spieler.y:=50; spieler.show; timer1.Enabled:=true; end; procedure TForm1.Timer1Timer(Sender: TObject); var i:integer; begin if GetAsyncKeyState(VK_LEFT)<0 then spieler.bewegen('links'); if GetAsyncKeyState(VK_RIGHT)<0 then spieler.bewegen('rechts'); if GetAsyncKeyState(VK_UP)<0 then spieler.bewegen('oben'); if GetAsyncKeyState(VK_DOWN)<0 then spieler.bewegen('unten'); image1.Canvas.Brush.color:=clwhite; image1.Canvas.FillRect(image1.ClientRect); spieler.show; for i:=1 to high(block) do block[i].show; end; end. |
Re: debugger Exception - pacman macht probleme
Die Indexzählung eines Arrays beginnt bei 0, deine Schleife zur erzeugung der Blöcke aber bei 1.
|
Re: debugger Exception - pacman macht probleme
Hab's geändert, funktioniert aber immer noch nicht.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type tspieler=class(Tobject) x,y:integer; procedure show; procedure bewegen(dir:string); end; tblock = class(TObject) bx,by:integer; da:boolean; procedure show; end; TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure malelevel(r:integer); procedure Timer1Timer(Sender: TObject); end; var Form1: TForm1; block:array of Tblock; level:array[0..13] of string; spieler:Tspieler; implementation {$R *.dfm} procedure Tspieler.show; begin form1.Image1.Canvas.Brush.color:=clyellow; form1.Image1.Canvas.Ellipse(x-8,y-8,x+8,y+8); end; procedure Tspieler.bewegen(dir:string); begin if (dir='links') then dec(x,5); if (dir='rechts') then inc(x,5); if (dir='oben') then dec(y,5); if (dir='unten') then inc(y,5); end; procedure Tblock.show; begin with form1.image1.Canvas do begin brush.color:=clskyblue; rectangle(bx,by,bx+21,by+21) end; end; procedure Tform1.malelevel(r:integer); var i,k:integer; begin if r=1 then begin level[0]:= 'xxxxxxxxxxxxxxxxxxxx'; level[1]:= 'x xxxx xx'; level[2]:= 'x xxx x x xx'; level[3]:= 'x x xx'; level[4]:= 'x xx x xxx xx xx'; level[5]:= 'x xx x xxx xx xx'; level[6]:= 'x xx x xxx xx xx'; level[7]:= 'xxxxx xxxxxxx xx'; level[8]:= 'xxxxxx xxxxxxxxxxxxx'; level[9]:= 'xx xxxxxx'; level[10]:= 'xxx xx xxxxxxx'; level[11]:= 'x xxxxxxx x'; level[12]:= 'xxxxxxxxxx xxxx'; level[13]:= 'xxxxxxxxxxxxxxxxxxxx'; end; setlength(block,high(level)*length(level[1])); for k:=0 to high(level) do for i:=0 to length(level[k]) do begin block[i]:=tblock.Create; block[i].bx:=i*20; block[i].by:=k*20; if level[k][i]='x' then block[i].da:=true else block[i].da:=false; end; end; procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin spieler:=Tspieler.Create; malelevel(1); spieler.x:=100; spieler.y:=50; spieler.show; timer1.Enabled:=true; end; procedure TForm1.Timer1Timer(Sender: TObject); var i:integer; begin if GetAsyncKeyState(VK_LEFT)<0 then spieler.bewegen('links'); if GetAsyncKeyState(VK_RIGHT)<0 then spieler.bewegen('rechts'); if GetAsyncKeyState(VK_UP)<0 then spieler.bewegen('oben'); if GetAsyncKeyState(VK_DOWN)<0 then spieler.bewegen('unten'); image1.Canvas.Brush.color:=clwhite; image1.Canvas.FillRect(image1.ClientRect); spieler.show; for i:=0 to high(block) do block[i].show; end; end. |
Re: debugger Exception - pacman macht probleme
In Zeile 85 muß es dann folgerichtig heißen
Delphi-Quellcode:
for i:=0 to length(level[k]-1) do begin
|
Re: debugger Exception - pacman macht probleme
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habs geändert auf
Delphi-Quellcode:
daran scheints nicht gelegen zu haben.
for i:=0 to length(level[k])-1 do begin
Ich häng einfach mal das Projekt an, hoffentlich bekommt es noch jemand raus. |
Re: debugger Exception - pacman macht probleme
Der Fehler tritt in Zeile 59 auf, da bx komischerweise den Wert 65100 hat. Ich Versuche mal das Programm zu debuggen
|
Re: debugger Exception - pacman macht probleme
Müßte es in Zeile 86 ff nicht block[i,k] heißen?
|
Re: debugger Exception - pacman macht probleme
Ich hab den Fehler wegbekommen.
Wenn bei Timer1.OnTimer in der letzten Zeile das High(Block) durch High(level) ersetzt wird, funktioniert es. |
Re: debugger Exception - pacman macht probleme
Zitat:
anstatt high(level) anzugeben kann man eine zahl bis 19 einsetzen und es funktioniert. beim 20. Block ist dann aber irgendwas faul Zitat:
Delphi-Quellcode:
setlength(block,high(level)*length(level[1]));
for k:=0 to high(level) do for i:=0 to length(level[k]) do begin block[i*k]:=tblock.Create; block[i*k].bx:=i*20; block[i*k].by:=k*20; if level[k][i]='x' then block[i*k].da:=true else block[i*k].da:=false; block[i*k].show; end; richtig funktionieren tuts allerdings immer noch nicht. Wie bitte kommt bx an den wert 65100? muss ich da am anfang irgendetwas initialisieren? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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