Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 26. Feb 2013, 13:56
In der Informatik gibt es sogenannte Zustandsautomaten.
Wenn du eine bestimmte Abfolge von Aktionen haben möchtest, dann wäre das ein heiser Kandidat.

Im Formular benötigst du eine Variable für den aktuellen Zustand:
Delphi-Quellcode:
TForm1 = class(TForm)
private
  zustand : Integer;
...
end;
Du startest den Zustandsautomaten mit einem Button:
Delphi-Quellcode:
procedure TForm1.StartButtonClick(Sender:TObject);
  zustand := 0; // Anfangszustand
  Timer1.Interval := 800; // alle 0,8s ein Zustandwechsel
  Timer1.Enabled := True;
end;
Im Timer Event liegt die Hauptarbeit:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender:TObject);
var
  neu_zustand : integer;
begin
  neu_zustand := zustand + 1;
  case zustand of
    0: self.Color := clGreen; // Hintergrund grün
    1: MovePlayerLeft; // Spielfigur bewegen
    2: MovePlayerLeft; // Spielfigur bewegen
    3: MovePlayerUp;
    4: MovePlayerUp;
    5: self.Color := clWindow;
    6: Timer1.Enabled := False; // Animation beendet, Timer abstellen
  end;
  zustand := neu_zustand;
end;
In dem Beispiel läuft "zustand" von 0 bis 6 durch und dann endet das Ganze.
Es ist aber durchaus möglich, von dem normalen Ablauf abzuweichen und abhängig von einer Bedingung zu jedem anderen Zustand zu springen:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender:TObject);
var
  neu_zustand : integer;
begin
  neu_zustand := zustand + 1;
  case zustand of
    0: self.Color := clGreen; // Hintergrund grün
    1: MovePlayerLeft; // Spielfigur bewegen
    2: MovePlayerLeft; // Spielfigur bewegen
    3: begin
        MovePlayerUp; // nach oben
        if ShapePlayer.Top > 20 then
          neu_zustand := 2;
    5: self.Color := clWindow;
    6: Timer1.Enabled := False; // Animation beendet, Timer abstellen
  end;
  zustand := neu_zustand;
end;
Denk auch daran, dass du je nach Zustand den Timer schneller oder langsamer machen kannst.

Viel Spass beim Ausdenken deiner Animation!
Man kann die Zustandvariable auch mit einem Aufzählungstyp abbilden.
Für den Anfang würde ich aber bei einem Integer bleiben, weil das weniger Schreibarbeit ist und mehr Raum für spontane Änderungen lässt.
  Mit Zitat antworten Zitat