Zitat von
Simme:
Sorry, war das zu viel?
Eigentlich war das zu wenig, die Deklarationen der global verwendeten Typen und Variablen fehlen.
Dein Projekt ist extrem unübersichtlich, da alles in einer großen Methode steht.
Niemand will sich so etwas gern anschaun.
Du solltest mit Unterfunktionen mit Parametern und Rückgabewerten arbeiten.
Jede Unterfunktion erfüllt dabei genau eine Aufgabe.
Der Namen der Funktion kann die Aufgabe beschreiben.
Beipiel:
Delphi-Quellcode:
function TForm2.GetFeldImage(x, y: Integer): TImage;
begin
Result := TImage(FindComponent('Feld' + IntToStr(y) + '_' + IntToStr(x)));
end;
function TForm2.SpielerFeldKollision(Spieler: TImage; Feld: TImage): Boolean;
begin
Result := PtInRect(Feld.BoundsRect, Spieler.p1) or
PtInRect(Feld.BoundsRect, Spieler.p2) or
PtInRect(Feld.BoundsRect, Spieler.p3) or
PtInRect(Feld.BoundsRect, Spieler.p4) or
end;
procedure TForm2.SpielerSieg(Spieler: TImage);
var
sMsg: string;
begin
if Spieler = Spieler1 then
sMsg := Form1.name2 + ' ist tot! ' + Form1.name1 + ' hat gewonnen!'
else
sMsg := Form1.name1 + ' ist tot! ' + Form1.name2 + ' hat gewonnen!';
ShowMessage(sMsg);
Form1.Visible := True;
Form1.Panel3.Visible := True;
tot := True;
Form2.Close;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
FeldImage: TImage;
{...}
FeldImage := GetFeldImage(x_wert + zaehler, y_wert);
FeldImage.Picture.LoadFromFile('Bilder&Animationen\rot.bmp');
if SpielerFeldKollision(Spieler1, FeldImage) then
begin
SpielerSieg(Spieler2);
BREAK;
end;
if SpielerFeldKollision(Spieler2, FeldImage) then
begin
SpielerSieg(Spieler1);
BREAK;
end;
Das ist doch übersichtlicher und verständlicher als im Vergleich dein Konstrukt und das kommt auch gleich mehrmals vor:
Delphi-Quellcode:
TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Picture.LoadFromFile('Bilder&Animationen\rot.bmp');
If (((Spieler1.p1.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler1.p1.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler1.p1.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler1.p1.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler1.p2.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler1.p2.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler1.p2.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler1.p2.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler1.p3.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler1.p3.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler1.p3.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler1.p3.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler1.p4.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler1.p4.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler1.p4.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler1.p4.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))) Then
begin
ShowMessage(Form1.name1 + ' ist tot! ' + Form1.name2 + ' hat gewonnen!');
Form1.Visible := True; Form1.Panel3.Visible := True; tot := True;
Form2.Close;
BREAK;
end;
If (((Spieler2.p1.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler2.p1.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler2.p1.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler2.p1.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler2.p2.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler2.p2.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler2.p2.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler2.p2.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler2.p3.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler2.p3.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler2.p3.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler2.p3.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
Or ((Spieler2.p4.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
And (Spieler2.p4.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
And (Spieler2.p4.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
And (Spieler2.p4.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))) Then
begin
ShowMessage(Form1.name2 + ' ist tot! ' + Form1.name1 + ' hat gewonnen!');
Form1.Visible := True; Form1.Panel3.Visible := True; tot := True;
Form2.Close;
BREAK;
end;
Dein eigentliches Problem ist aber, daß die OnTimer Methode im ProzessMessage rekursiv aufgerufen wird.
Das könnte verhindert werden, z.B. in dem der Timer wärend der Verarbeitung angehalten wird.
Delphi-Quellcode:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
try
finally
Timer1.Enabled := True;
end;
end;