@DeddyH
Wie sehen denn die verwendeten Klassen (THintergund etc.) aus? Und gewöhn Dir lieber gar nicht erst an, mit true oder false zu vergleichen, das kann zu falschen Ergebnissen führen.
Die OnKeyDown-Methode würde ich etwas anders schreiben:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_LEFT:
Links := True;
VK_Right:
Rechts := True;
VK_Up:
Hoch := True;
VK_Down
Runter := True;
end;
end;
Dein verkürzter Quelltext ist zwar syntaktisch korrekt und sicherlich "besser" als das Original: Aber er enthält weiterhin den gleichen Fehler: Ist Links einmal True, bleibt Links = True (dito für die drei anderen Variabeln).
Delphi-Quellcode:
procedure TForm1.TiGameEngineTimer (Sender: TObject);
begin
IF (Links = True) and (Kopf.GetZXPosition > 0) Then
begin
Kopf.bewege_links();
end;
...
Ist der Kopf einmal links, bleibt er immer links.
Mir erscheint eine derartige Lösung sinnvoller:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Links := Key = VK_LEFT;
Rechts := Key = VK_Right;
Hoch := Key = VK_Up;
Runter := Key = VK_Down;
end;
Key kann hier die Werte 37 bis 40 enthalten, die problemlos beim Form ankommen, diesbezügliche Befürchtungen sind unbegründet.
Mit
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ShowMessage(IntToStr(key));
end;
schön überprüfbar (zumindest bei Delphi 7). Im Debugger wird's nicht anders aussehen.