Hallo!
Also ich hab ziemlich lange gebraucht um deinen Code zu verstehen, bzw. kenn ich mich noch immer nicht so ganz aus :/
Warum so viele Timer, ist es richtig dass du für jede Bewegungsrichtung einen Timer hast?
Besser ist es, wenn du mit TPoint arbeitest!
Delphi-Quellcode:
var
Dir : TPoint;
Speed : Integer;
procedure onKeyDown();
begin
iF Key = vk_LEFT Then Point(-1, 0);
iF Key = vk_RIGHT Then Point( 1, 0);
iF Key = vk_UP Then Point( 0, 1);
iF Key = VK_DOWN Then Point( 0,-1);
end;
procedure Timer.OnTimer();
begin
//Bewegung
Koerper.Left := Koerper.Left + (Speed * Dir.X);
Koerper.Top := Koerper.Top + (Speed * Dir.Y);
//Kollisionsabfrage
iF Collision Then
begin
Verloren();
end;
end;
Ebenso besser wäre es evt. die Kollisionsabfrage in eine Function zu geben..mit einem Boolean als Rückagewert.
lg
/edit
Einfacher ist es auch wenn du den TSnake-Record als Klasse machst
z.B:
Delphi-Quellcode:
type
TSnake = class (TImage)
function Collision() : Boolean; //für Kollisionsabfrage
public
Speed : Integer;
Dir : TPoint ;
Laenge : Integer;
end;
var
Snake : TSnake;
//Erstellen
Snake := TSnake.Create(Form);
with Snake do
begin
Parent := Form:
Picture.LoadFromFile('');
Speed := 1;
Dir := Point(0, 0);
Laenge := 6;
AutoSize := TRUE;
Show;
end;
//Timer
Snake.Left := Snake.Left + Snake.Dir.X;
...
if Snake.Collision Then
...