Einzelnen Beitrag anzeigen

Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#20

Re: Anfängerin muss (ähnliches wie) Frogger programmieren

  Alt 20. Dez 2004, 17:08
Ich denke die einfachste Lösung ist diese:

Du setzt auf jede Fahrspur ein TImage mit dem Auto-Bild drin. Dann nimmst du einen Timer, und mit diesem bewegst du alle Autos pro Zeiteinheit einen gewissen Wert zum rechten Rand. Wenn die x-Koordinate eines Auto-TImages (also die Left-Eigenschaft des Images) einen bestimmten Wert überschreitet (in deinem Fall z.B. 500), dann setzt du es zurück an den Anfang der Straße (und lädst vielleicht ein anderes Auto-Bild). Auf diese Weise kann auf jeder Fahrspur immer nur ein einziges Auto fahren, aber wenn man etwas mit der Geschwindigkeit der Autos spielt, wird das schon nicht zu einfach.
Zusätzlich überprüfst du noch in jedem Timer-Aufruf, ob eines der Autos mit dem Frosch zusammengestoßen ist. Das geht über die Left- und Top-Eigenschaften (welche die x-, und y-Koordinate des linken oberen Eckpunkts der Bilder angeben) und der Width- und Height-Eigenschaften (welche die Breite und die Höhe der Bilder angeben).

Die Überprüfung, ob das Frosch-Image mit einem Auto-Image zusammengestoßen ist, funktioniert folgendermaßen:
Delphi-Quellcode:
if (Frosch.Left + Frosch.Width > Auto.Left) and
   (Frosch.Left < Auto.Left + Auto.Width) and
   (Frosch.Top + Frosch.Height > Auto.Top) and
   (Frosch.Top < Auto.Top + Auto.Height) then
begin
  // Zusammenstoß!
end;
In einer Schleife kannst du überprüfen, ob der Frosch mit einem beliebigen Auto zusammengestoßen ist. Wenn du die Auto-Images in aufsteigender Reihenfolge benennst (also z.B. Auto1, Auto2, Auto3, Auto4, etc.), dann könntest du das so machen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Auto: TImage;
  AutoName: array[0..31] of Char;
  i: Integer;
begin
  for i := 1 to 10 do begin
    ZeroMemory(@AutoName, sizeof(AutoName));
    strlfmt(@AutoName, 32, 'Auto%d', [i]);

    Auto := TImage(FindComponent(AutoName));

    if (Frosch.Left + Frosch.Width > Auto.Left) and
       (Frosch.Left < Auto.Left + Auto.Width) and
       (Frosch.Top + Frosch.Height > Auto.Top) and
       (Frosch.Top < Auto.Top + Auto.Height) then
    begin
      // Zustammenstoß mit Auto i!
    end;
  end;
end;
In diese Timerprozedur kannst du dann noch eine Schleife schreiben, in der jedes Auto um einen gewissen Wert nach rechts bewegt wird, und dass ein Auto zurückgesetzt wird, wenn es den rechten Rand erreicht hat.

Die Bewegung des Frosches machst du in einer OnKeyDown-Prozedur.
  Mit Zitat antworten Zitat