![]() |
fortlaufende Animationen - ohne Freeze
Hallo alle miteinander,
ich programmiere gerade (mal wieder?) einen LED Cube Simulator mit OpenGL. Dies soll einfach dazu da sein um ein paar Animation auf einem großen LED Cube (12³) darzustellen. Diese sollen dann später mal auf einem echten LED Cube in der Größe dargestellt werden. Nun habe ich bis jetzt folgendes: OpenGL Ausgabe steht und der LED Cube steht selber in einem Array dar. Nun geht es aber darum die Animation drauf abzuspielen. Diese sollten natürlich auch pausierbar sein. Nun wollte ich einen Timer verwenden und dann, je nachdem welche Animation ausgewählt ist, eine procedure aufrufen. Der Timer sollte dafür da sein, um die Animationen fortlaufend zu haben. Jetzt ist aber das Problem, dass wenn ich Sleep anwenden möchte sich das ganze Programm festhängt. Ich habe nun ein einfaches Blinken hinbekommen in dem ich in der Prozedur eine Variable hochzähle und dann je nach dem ob an oder aus den LED Cube aus oder an schalte. Dies müsste dann mit globalen Variablen geschehen, weil man ja Variablen nicht so direkt in einem Timer initialisieren kann. Meine Frage nun, wie ich das am elegantesten lösen kann, dass ich eine fortlaufende Animation habe, die den das Programm nicht festhängen lasse und gleichzeitig auch Sleep unterstützen und am besten mit wenig globalen Variablen auskommt. |
AW: fortlaufende Animationen - ohne Freeze
Wozu benötigst Du denn Sleep, etwa zum Pausieren der Animation?
Wenn Du die Animation angehalten hast, kannst Du ja entweder den Timer anhalten oder falls dieser noch weitere Aufgaben erfüllt eine Bool'sche Variable verwenden die bei jedem Timer-Ereignis abgefragt wird und entsprechend die Animation dargestellt wird oder auch nicht. |
AW: fortlaufende Animationen - ohne Freeze
Sleep dafür, um das aktuelle Bild anzuzeigen.
Beispiel:
Delphi-Quellcode:
Und das halt im Timer, und damit dann pausieren oder fortsetzen.
LED Cube an
500ms warten LED Cube aus 500ms warten |
AW: fortlaufende Animationen - ohne Freeze
und warum stellst Du den Timer nicht auf 500 ms und verwendest ein Flag das Dir angibt ob die LED an, bzw. aus ist oder ob die Animation pausiert ist?
|
AW: fortlaufende Animationen - ohne Freeze
Es ist schon komisch, dass
![]() |
AW: fortlaufende Animationen - ohne Freeze
Zitat:
//Edit: Eigentlich wollte ich an dieser Stelle noch einen Vorschlag zu den oben von mir vorgeschlagenen Flags machen. Bitte jetzt nicht alles in wilden globalen Variablen unübersichtöich anlegen, sondern lieber eine gut durchdachte Bitmaske nutzen. Wie's geht findet man ![]() |
AW: fortlaufende Animationen - ohne Freeze
Naja ich will den Timer auch für andere Animationen haben.
Deshalb gibt es eine andere Möglichkeit eine bestimmte Zeit zu warten oder soll ich dann den Timer für die Animationen in einem eigenen Thread laufen lassen? |
AW: fortlaufende Animationen - ohne Freeze
Zitat:
Ein Thread, welcher nur wartet und sich sonst mit der VCL synchronisieren muß, wird ein kleines bissl unterfordert sein. (schließlich sind Threads dafür da, um etwas zu machen) Ein Timer wäre also genau die ideale Lösung. TTimer laufen immer im Hauptthread es wird innerhalb der TThreadklasse eine unsichtbare Form erstellt, welche mit dem Haupthtread verbunden wird und ein Thread, dessen "Arbeit" nur aus Sleep besteht, ist halt nutzlos. ![]() |
AW: fortlaufende Animationen - ohne Freeze
Zitat:
Willst Du allerdings mehrere Animationen parallel ablaufen lassen würde ich ggf. mehrere Timer einsetzen oder schöner eine Objekt-Behandlungsroutine im Timer-Event hinterlegen und die Animationsobjekte z.B. über eine TObjectList verwalten und abarbeiten. Um besser auf Deine Problematik eingehen zu können, wie gestaltest Du eigentlich Deine Animation, wie sieht das entsprechende Objekt zur Zeit aus und wie gestaltest Du den Aufruf? Und auch ganz wichtig welche Arten und wie viele Animationen möchtest Du gleichzeitig darstellen können? @himitsu: Deine Variante mit Delay im Timer ist auch recht interessant. Damit werde ich auch mal experimentieren. |
AW: fortlaufende Animationen - ohne Freeze
Gesetz der Fall du würdest deine Animationen in einem AVIStream wiedergeben können.
Dann benötigst du kein Sleep sondern könntest direkt das Frame_XX (Bild) anzeigen lassen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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