![]() |
AW: fortlaufende Animationen - ohne Freeze
So ich hab mal ein wenig rumexperimentiert. Jedoch freezt sich mein Programm immer noch.
Also auf dem Hauptformular gibt es einen Timer, der für die Animation ausführern soll und danach auch wiederholen. Diese Animationen sind einzelne Prozeduren in einer anderen Unit. Nun habe ich in der anderen Unit einen Timer erstellt um eine gewisse Zeit warten zu können, ohne jeglichen Erfolg. Also der Timer auf meinem Hauptformular ganz billig (wird mit 2 Buttons gestartet/gestoppt):
Delphi-Quellcode:
Die rotierende Ebene ist noch nicht programmiert, da ich die eine Animation ja noch nicht ganz hab. ;)
//Effekte Timer
procedure TfrmMain.effectTimer(Sender: TObject); begin //Blinken Animation if blinken1.Checked then begin ani_blinken(); end //mittlere Ebene rotieren else if rotierendeEbene1.Checked then begin end; end; Und dann in der Unit animations:
Delphi-Quellcode:
Die clear_cube und set_cube Funktionen sind in einer anderen Unit. Dort sollen später 0815-Zeichen-Routinen rein, damit man zum Beispiel eine Ebene nicht imemr mit Schleifen füllen muss.
unit animations;
interface uses ExtCtrls; type TMyTimer = class(TTimer) procedure TimerProc(Sender: TObject); end; procedure waitpertimer(msec: Integer); procedure ani_blinken(); var timetoend: Integer; timestriked: Integer = 0; timeend: Boolean; implementation uses windows, Forms, draw; procedure TMyTimer.TimerProc(Sender: TObject); begin inc(timestriked); if timestriked = timetoend then begin timestriked := 0; timeend := true; end; end; procedure waitpertimer(msec: Integer); var Timer: TMyTimer; begin Timer := TMyTimer.Create(nil); Timer.Enabled := False; Timer.Interval := 10; Timer.OnTimer := Timer.TimerProc; timetoend := round(msec/10); timeend := false; Timer.Enabled := True; repeat Application.ProcessMessages; until (timeend); Timer.Enabled := False; Timer.Free; end; //Lässt den LED Cube blinken procedure ani_blinken(); begin //Cube an set_cube(); waitpertimer(500); //Cube aus clear_cube(); waitpertimer(500); end; end. |
AW: fortlaufende Animationen - ohne Freeze
Warum zählst Du extra eine globale Variable hoch, anstatt die Systemuhr für Dich die vergangene Zeit angeben zu lassen?
Abgesehen davon finde ich Deinen Ansatz recht verworren.:? Warum organisierst Du die Blinkattacken Deiens Würfels nicht in einem eigenen Objekt und später die Rotation in einem anderen. Dann kannst Du diese Animationen als Objekte in eine Liste erzeugen und Deinen Timer in regelmäßigen kurzen Abständen diese Liste abarbeiten lassen. Deinen Timer hat doch nicht zu interessieren was Deine Objekte anzeigen, er hat nur dafür sorge zu tragen, dass die Objekte immer wider mal angestuppst werden um den Bildschirm zu aktualisieren. Wenn Du noch die Parentform an Deine Objekte übergibst, kannst Du direkt aus den Objekten heraus das Neuzeichnen der Form oder besser Übergabe der Zeichenfläche udn refresh der Zeichenfläche auslösen. Tut mir leid, dass ich gerade eher den Eindruck habe als ob Du dabei bist Dein Projekt ein wenig zu einem Nudelgericht zu verdrehen. |
AW: fortlaufende Animationen - ohne Freeze
Naja die Delayfunktionen die himitsu verlinkt hat, die produzieren auch freezes.
|
AW: fortlaufende Animationen - ohne Freeze
So schwer kann das doch nicht sein ...
Nimm den Timer als Taktgeber und das Intervall stellst du auf den ggT aller Animationsintervalle.
Code:
Für die Animation kannst du ja Klassen erstellen, die z.B. wie folgt aufgebaut sind:
Animation1 1000ms
Animation2 1500ms Animation3 2000ms Animation4 2500ms ggT => 500ms Animation1 => 2 Zyklen Animation2 => 3 Zyklen Animation3 => 4 Zyklen Animation4 => 5 Zyklen
Delphi-Quellcode:
und bei TimerEvent
TCustomAnimation = class
private FTaktCount : integer; FZyklen : integer; protected procedure DoAnimation; virtual; abstract; public procedure Taktung; property Zyklen : integer read FZyklen write FZyklen; end; procedure TCustomAnimation.Taktung; begin Inc( FTaktCount ); if FTaktCount >= FZyklen then begin FZyklen := 0; DoAnimation; end; end;
Delphi-Quellcode:
Ein Timer, kein Sleep, kein Freeze, alles schick
procedure TForm1.Timer1Timer( Sender : TObject );
var idx : integer; begin for idx := 0 to AnimationList.Count - 1 do TCustomAnimation( AnimationList[ idx ] ).Taktung; end; |
AW: fortlaufende Animationen - ohne Freeze
Zitat:
Timer oder Sleep bzw. Delay statt Sleep |
AW: fortlaufende Animationen - ohne Freeze
@Sir Rufo: Ja, so ungefähr habe ich mir das auch vorgestellt. Dann ist es sauberer Code der am Ende auch leicht erweiterbar ist. War selbst heute nur zu faul dies in Code zu packen, da ich nebenher an einem anderen Projekt gearbeitet habe.
@himitsu: Äh, nein nicht falsch verstanden, sorry, nur falsch geschrieben...:pale: meinte Delay statt Timer, bzw. Sleep anstatt von Delay mit Timer oder so... Ansonsten wäre ich ja selbst auf genau das reingefallen was ich vorher auch bemeckert hatte... klar soweit? :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz