| Autor |
Beitrag |
Vampyrexx
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 26.12.02 17:39
Der Fehler ist, dat die Kollisionsabfrage net funzt.
Ich lass das Level aus einer Datei als TStringList laden.
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.
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)=-
|
|
|