Also erst einmal muss ich sagen, dass dieser Code sehr unübersichtlich ist, und dass man ihn sehr einfach auf diese Größe kriegen kann:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if char (key) = 'W' then
movie1.Top:= movie1.Top -10;
if char (key) = 'S' then
movie1.Top:= movie1.Top +10;
if char (key) = 'A' then
movie1.left:= movie1.left -10;
if char (key) = 'D' then
movie1.left:= movie1.left +10;
if key = VK_UP then
movie2.Top:= movie2.Top -10;
if key = vk_down then
movie2.Top:= movie2.Top +10;
if key = vk_left then
movie2.left:= movie2.left -10;
if key = vk_right then
movie2.left:= movie2.left +10;
end;
So finde ich das schonmal viel übersichtlicher.
Und jetzt zu deinem Problem, dass du nicht mehrere Bewegungen auf einmal ausführen kannst.
1) Nimm dir einen Timer und setze ihn auf das Formular.
2) Nimm den gleichen Code wie oben, aber ersetze
if Char(key) = 'W' then
durch
if getasynckeystate(ord('W')) < 0 then
das wiederholst du für die anderen If-Abfragen nach dem gleichen Prinzip.
3) Jetzt setze das Intervall des Timers auf eine etwas höhere Geschwindigkeit, z.b. 50 ms.
Die Bewegung sollte so funktionieren.
Zum Thema Kollision:
http://www.dsdt.info/tipps/?id=416&search=rect
Dürfte genau das richtige für dich sein
@EWeiss: ich wusste gar nicht, dass man die Keys mit AND verknüpfen kann (und was gescheites dabei rauskommt) o.O
Das probier ich mal aus^^