Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   debugger Exception - pacman macht probleme (https://www.delphipraxis.net/71149-debugger-exception-pacman-macht-probleme.html)

mr.winkle 9. Jun 2006 16:38


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:
for i:=1 to high(block) do showblock(i);
(ganz unten im ontimer ereignis)
gibts diesen Fehler, blau markiert ist dann die zeile
Delphi-Quellcode:
rectangle(bx,by,bx+21,by+21);
in tblock.show.

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.

mkinzler 9. Jun 2006 16:42

Re: debugger Exception - pacman macht probleme
 
Die Indexzählung eines Arrays beginnt bei 0, deine Schleife zur erzeugung der Blöcke aber bei 1.

mr.winkle 9. Jun 2006 16:52

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.

mkinzler 9. Jun 2006 17:04

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

mr.winkle 9. Jun 2006 17:21

Re: debugger Exception - pacman macht probleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habs geändert auf

Delphi-Quellcode:
for i:=0 to length(level[k])-1 do begin
daran scheints nicht gelegen zu haben.

Ich häng einfach mal das Projekt an, hoffentlich bekommt es noch jemand raus.

mkinzler 9. Jun 2006 17:43

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

mkinzler 9. Jun 2006 17:44

Re: debugger Exception - pacman macht probleme
 
Müßte es in Zeile 86 ff nicht block[i,k] heißen?

Cyberbob 9. Jun 2006 23:36

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.

mr.winkle 11. Jun 2006 02:35

Re: debugger Exception - pacman macht probleme
 
Zitat:

Zitat von Cyberbob
Ich hab den Fehler wegbekommen.

Wenn bei Timer1.OnTimer in der letzten Zeile das High(Block) durch High(level) ersetzt wird, funktioniert es.

bringt aber irgendwie nichts, dann werden halt nur 14 blöcke angezeigt

anstatt high(level) anzugeben kann man eine zahl bis 19 einsetzen und es funktioniert.
beim 20. Block ist dann aber irgendwas faul


Zitat:

Zitat von mkinzler
Müßte es in Zeile 86 ff nicht block[i,k] heißen?

ok, das hab ich geändert, ein fehler ist gefunden.

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