Autor Beitrag
Vampyrexx
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 22.12.02 18:30 
Moin,

Ich versuch grad in Info ne Facharbeit zu proggen... als Thema hab ich mir Pacman ausgesucht, allerdings hab ich da ein Problem bei der "Kollisionsabfrage".

Hier erst mal der Quelltext:

Zitat:
unit PacmanSteuerung;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Math;

type
Elemente = Array [0..19, 0..19] of TImage;
TForm1 = class(TForm)
Timer1: TTimer;
Image1: TImage;
Panel1: TPanel;
Memo1: TMemo;
Memo2: TMemo;
Label1: TLabel;
Timer2: TTimer;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1 : TForm1;
Animation : Integer = 1;
Bewegung : Integer = 1;
BilderElemente : Elemente;
Bild : TImage;
Richtung : Char = 'R';

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = vk_left then begin
if (Timer2.Enabled = False) then begin
Timer2.Enabled := True;
Richtung:= 'L';
end;
end;
if key = vk_right then begin
if (Timer2.Enabled = False) then begin
if (BilderElemente[(Image1.Left + Image1.Width) div 20, Image1.Height div 20].Enabled = True) then showmessage('h3h3');
Timer2.Enabled := True;
Richtung:= 'R';
end;
end;
if key = vk_down then begin
if (Timer2.Enabled = False) then begin
Timer2.Enabled := True;
Richtung:= 'U';
end;
end;
if key = vk_up then begin
if (Timer2.Enabled = False) then begin
Timer2.Enabled := True;
Richtung:= 'O';
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
case Animation of
1 : image1.Picture.LoadFromFile('pac2' + Richtung + '.bmp');
2 : image1.Picture.LoadFromFile('pac3' + Richtung + '.bmp');
3 : image1.Picture.LoadFromFile('pac4' + Richtung + '.bmp');
4 : image1.Picture.LoadFromFile('pac1' + Richtung + '.bmp');
end;

inc(Animation);
if Animation>=5 then dec(Animation,4);
end;

procedure TForm1.FormCreate(Sender: TObject);
var x, y, Zeile : Integer;
Level: TStringList;
LevelReal: String;
begin
Level:= TStringList.Create;
Level.LoadFromFile('Z:\Informatik\Pacman\Level 1.txt');
Zeile:= 0;

for x:= 0 to 19 do begin
for y:= 0 to 19 do begin
BilderElemente[x,y]:= TImage.Create(Self);
LevelReal:= Level.Strings[Zeile];
if (LevelReal[1] = 'M') then BilderElemente[x, y].Enabled := True;
Inc(Zeile);
BilderElemente[x,y].Picture.LoadFromFile(LevelReal);
BilderElemente[x,y].transparent:=true;
BilderElemente[x,y].enabled:=False;
with BilderElemente[x,y] do begin
Parent:= Self;
SetBounds(x * 20, y * 20, 20, 20);
end;
end;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
case Richtung of
'L' : Image1.left := Image1.Left - 5;
'R' : Image1.left := Image1.Left + 5;
'O' : Image1.Top := Image1.Top - 5;
'U' : Image1.Top := Image1.Top + 5;
end;
Inc(Bewegung);
if (Bewegung >= 5) then begin
Dec(Bewegung, 4);
Timer2.Enabled := False;
end;
end;

end.




Es gibt eigentlich nur 2 Möglichkeiten, wo der Fehler liegen könnte :

1.
Zitat:
if (LevelReal[1] = 'M') then BilderElemente[x, y].Enabled := True;
In dieser Abfrage liegt der Fehler nicht, da ich "M" und "True" schon mit einer showmessage ausgegeben habe und beide stimmen.

2.
Zitat:
if (BilderElemente[(Image1.Left + Image1.Width) div 20, Image1.Height div 20].Enabled = True) then showmessage('h3h3');
Ich vermute der Fehler liegt in dieser Abfrage, da das Bild [19,1] (das Bild an dem ich die Kollisionsabfrage überprüfe) eine Mauer und enabled auf true ist. Dies erkennt er allerdings nicht ... Wo könnte der Fehler liegen ?? HILLLLLLLLLLLFEEEEEEEEEEEEE!

Im Voraus danke für eure Hilfe

_________________
-=(Life just suxx)=-
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 26.12.02 17:15 
Was genau ist der Fehler ?
was soll passieren und Passiert nicht ?
ich schreibe auch gerade ein pac-man clone in DelphiX(direcX) und mein problem ist die KI.

MFG
mimi
Vampyrexx Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 26.12.02 17:39 
Der Fehler ist, dat die Kollisionsabfrage net funzt.

Ich lass das Level aus einer Datei als TStringList laden.
ausblenden 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:
procedure TForm1.FormCreate(Sender: TObject); 
 var x, y, Zeile : Integer; 
 Level: TStringList; 
 LevelReal: String; 
begin 
 Level:= TStringList.Create; 
 Level.LoadFromFile('Z:\Informatik\Pacman\Level 1.txt'); 
 Zeile:= 0; 

 for x:= 0 to 19 do begin 
  for y:= 0 to 19 do begin 
   BilderElemente[x,y]:= TImage.Create(Self); 
   LevelReal:= Level.Strings[Zeile]; 
   if (LevelReal[1] = 'M') then BilderElemente[x, y].Enabled := True; 
   Inc(Zeile); 
   BilderElemente[x,y].Picture.LoadFromFile(LevelReal); 
   BilderElemente[x,y].transparent:=true; 
   BilderElemente[x,y].enabled:=False; 
   with BilderElemente[x,y] do begin 
    Parent:= Self; 
    SetBounds(x * 20, y * 20, 20, 20); 
   end; 
  end; 
 end; 
end;


Das Level wird auch komplett richtig geladen, nur wenn ich über if (LevelReal[1] = 'M') then BilderElemente[x, y].Enabled := True; abfrage, ob der Anfangsbuchstabe n 'M' is, dann setzt der alle Bilder, die mitm 'M' beginnen, auf True. Aber in der Prozedur TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) funtz die Abfrage net. Hier sind alle Bilder auf True.

Ich habe schon überall alles überprüft.
ausblenden Quelltext
1:
2:
3:
4:
LevelReal:= Level.Strings[Zeile];
if (LevelReal[1] = 'M') then BilderElemente[x, y].Enabled := True;
Inc(Zeile);
BilderElemente[x,y].Picture.LoadFromFile(LevelReal);
Sind alle ok.

Wenn ich aber in der Prozedur TForm1.FormKeyDown die Eigenschaft Enabled abfrage, dann stimts net mehr, obwohl die Abfrage richtig ist if (BilderElemente[(Image1.Left + Image1.Width) div 20, Image1.Height div 20].Enabled = True) then showmessage('h3h3');

Ich denke, dat es so is, weil ich seid 3 Tagen kein Delphi mehr zu Hause hab! Aber ich habe alles überprüft und an irgendeiner Stelle (die in der Prozedur TForm1.FormKeyDown liegen müsste!) muss es einen Fehler geben.

_________________
-=(Life just suxx)=-