Timer erstellen
Übersicht

SkullspliterBetreff: Timer erstellen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tut mir Leid, dass ich schon wieder nerve, aber ich versteh das Thema in keinem Tutorial (auch nich im Buch) und hab auch mit der Suchfunktion nix ähnliches gefunden.
Also es geht um Timer. Ich versteh eigentlich das ganze Thema nich so genau. Also einem Timer gibt man den Parameter 1 bis 60 um ihm zuzuschreiben, wieviele Bruchteile er quasi aus einer Sekunde machen soll. Soweit richtig? Zählt ein Timer unendlich lang, oder beginnt er nach diesen, z.B.60 teilen von Vorne? Oder hört er ganz auf? Kann ich die ganze createtimer-geschichte nehmen, wenn ich jetzt z.B. meinen Mauszeiger drehen will? Ich hab mir das eigentlich so gedacht, dass man den Timer erstellt und dann bei z.B. 15 das erste Bild der Animation abspielt und dann nach 30 z.B. das nächste oder is das falsch? Wie soll man das sonst mit animationen machen, da sie sonst, meiner Meinung nach, viel zu schnell abgespielt würde. Vielen Dank für euer Verständniss und nochmal grosses Sorry, aber ich raff das einfach nich ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal is der Topic net gut gewählt udn zweitens benutz doch einfach millisecs wenn dir timer zu kompliziert is =)
Code: [AUSKLAPPEN] if timer + 1000 < millisecs() ;was er jede Sekunde emachen soll Timer = millisecs() end if solte so gehen =) |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für Animationen ist das einzig wahre MilliSecs(). Bsp.:Code: [AUSKLAPPEN] If MilliSecs()>timer+100 Then
Und jetzt nimm ein Blatt Papier und setz für die Variablen reele Werte ein, z.B.:Zitat:timer=MilliSecs() frame=frame+1 If frame=maxframe Then frame=0 EndIf Wenn 5000 größer 4899+100 dann
Fertich is die Laube timer=5000 frame=0+1 Wenn frame größer 5 dann frame gleich 0 Ende wenn Nächster Durchlauf, es sind 2 Millisekunden vergangen Wenn 5002 größer 5000+100 dann timer=5002 frame=1+1 Wenn frame größer 5 dann frame gleich 0 Ende wenn ![]() Ich mach das immer so wenn ich solche Sachen nicht kapiere ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Shogo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Timer erstellen
Code: [AUSKLAPPEN] Timer=CREATETIMER (Frequenz#)
Frequenz gibt die Takte pro Sekunde an bei 60 wird Z.b. 60 mal pro sek. ein timersignal erzeugt. An den Anfang deiner Hauptschleife setzt du dann, Code: [AUSKLAPPEN] Anzahl=WAITTIMER (Timer)
Waittimer hält das Programm an bis es ein Timersignal erhält hier Z.b. 60 mal in der sek. So läuft das Programm immer gleich schnell. --- Soll das Programm nicht angehalten werden mußt du dir Z.b. so einen eigenen Timer progen. Code: [AUSKLAPPEN] REPEAT jetzt = millisecs() if jetzt > vorhin + 15 then; If Anweisung wird alle 15 millisekunden wiederholt. ... vorhin = jetzt end if until keyhit(1) |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Falls du BlitzPlus hast:
Code: [AUSKLAPPEN] takte_pro_sekunde=60
timer=CreateTimer(takte_pro_sekunde) Repeat event=WaitEvent() If event=$4001 Then ;Hauptschleife EndIf Until KeyHit(1) ;was weiß ich, irgendwie ;so in die Hauptschleife reinklatschen... Ansonsten sind die aufgeführten Versionen genaus das richtige. |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Waittimer() gibts auch bei BlitzPlus. Events nutzt man ja eh nur bei Anwendungen (ich zumindest). MfG | ||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Funktioniert aber laut der Online-Hilfe dort nicht mehr.
Daher bin ich der Meinung, dass WaitEvent() die bessere Variante ist. |
||
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey schonmal vielen Dank für die vielen schnellen Antorten und das ihr mir nicht gleich den Kopf abreisst.
Ich guck mir die ganzen Beiträge aber trotzdem erst Morgen an, weil ich schon zu ausgepowert bin (habe heute erst gelernt colli-abfragen auswendig zu nutzen z.B. bei mausklick-button-sachen) Trotzdem vielen Dank ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() /edit: Is mir ja richtig peinlich aber, ich glaube hubsi, hat das geschrieben: Für Animationen ist das einzig wahre MilliSecs(). Bsp.:Code: If MilliSecs()>timer+100 Then timer=MilliSecs() frame=frame+1 If frame=maxframe Then frame=0 EndIf Und jetzt nimm ein Blatt Papier und setz für die Variablen reele Werte ein, z.B.:Zitat: Wenn 5000 größer 4899+100 dann timer=5000 frame=0+1 Wenn frame größer 5 dann frame gleich 0 Ende wenn Aber ich dachte jetzt das Timer ( siehe 5. Zeile von unten) nur bis maximal 60 gehen. Oder gehen die bis unentlich?Weil das ging noch nicht so genau hervor. Die millisecs erhöhen sich doch ständig oder? ja klar müssen se ja ![]() läuft millisecs eigentlich schneller, als der Timer? Das müsste er doch, oder? Und was hat das dann für Auswirkungen, wenn ich den Timer mit 45 statt 60 mache auf eure Code-beispiele? |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Beispiel von Hubsi beschrieb wie man selber einen Timer programmiert mit Hilfe der Funktion millisecs()
millisecs() liefert die Anzahl Millisekunden zurück die seit dem starten des PCs vergangen sind. Auch bekannt als Ticks. (Obwohl 1 tick vielleicht nicht 1 ms ist, weiss ich auch nicht genau). Die Variable timer bei Hubsi wird also manuell verwaltet. Die wurde nicht mit Createtimer erstellt. Du speicherst zum Beispiel in einer Variable einfach die aktuelle Laufzeit des PCs. Code: [AUSKLAPPEN] variable = millisecs()
Was aber viel mehr bringt ist sowas: Code: [AUSKLAPPEN] variable = millisecs() + 5000
Damit speicherst du die jetzige Zeit plus 5 Sekunden (5000 millisek.). Nun willst du wenn diese Zeit erreicht wird etwas machen lassen: Code: [AUSKLAPPEN] If millisecs() >= variable then
;mach irgendwas... variable = millisecs() + 5000 Endif Ok eigentlich ganz simpel. Wenn die aktuelle Zeit grösser oder gleich wird wie der in variable gespeicherte Zeitpunkt dann ist die gespeicherte Zeit also auch erreicht. Folglich kannst du dann deinen gewünschten anderen Code dort hineinschreiben. Wenn du willst das alle 5 Sekunden wieder etwas passiert musst du aber jedesmal auch die neue Zeit wieder in variable speichern. (Aktuelle Zeit + 5 Sekunden). Ist doch ganz einfach oder? |
||
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aber warum sind in den anderen Beispielen dann kein einziges mal diese speicher-variablen erwähnt worden? ![]() |
||
morszeck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
PROBIERE EINFACH DAS...
Code: [AUSKLAPPEN] for i=0 to 10
print millisecs() delay 123 next jetzt wird 10 mal millisecs() mit einer Verzögerung von 123 MilliSekunden oder 0.123 Sekunden auf dem Bildschirm aus gegeben... irgend sowas wirst du bekommen: 356253 356376 356499 ... Also immer +/- 123, kann eben wegen der Genauigkeit immer varieren... Well: immer probieren und testen... |
||
WinXpProf&SP2, B3D V1.88, B+ V1.40, BMax101Beta, AMD TB1.4GHz, DDR266/768MB, GeForce3@64MB |
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja aber das beantwortet ehrlich gesagt nicht meine letzte Frage ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil es drauf ankommt was du machst.
Bei CreateTimer brauchste die Speichervariablen nicht. Die Speichervariablen sind dazu da, Zeitabstände zu messen. Dies braucht man zb für FrameTweening und für zeitgesteuerte Programmierung. CreateTimer hingegen ist dazu da, nach einem gegebenen Zeitintervall ein Signal zu senden das mittels WaitTimer abgefangen werden kann. ( um zb auf XX FPS zu beschränken ) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noch mal ganz simpel:
createTimer(x) erzeugt einen Taktgeber, der x mal in der sekunde "ausschlägt". Mit waittimer() wartet das gesamte Programm auf den nächsten Taktschlag. Im Gegensatz dazu ist dass Konstrukt mit Millisecs() dazu geeignet in einem Laufenden Programm bestimmte Dinge nur alle xxx Millisekunden auszuführen, da es dass Programm nicht anhält sondern nur den Teil nach der Abfrage gegebenenfalls überspringt. Da das BB-Prog ja bei der Millisecs-Methode wissen muss zu welcher Laufzeit es den Abfrageteil auszuführen hat braucht es da auch selbstredend einen gespeicherten Wert. (kein automatismus wie bei Timer (welcher aber BB-intern sicher auch eine Variable setzt)). Persönlich bevorzuge ich die Millisecs()-Methode aus dem einfachen Grund weil sie universeller ist (mit waittimer kriegst du keine vernünftige Animation zum Laufen, zumindest nicht wenn einzelne Bewegungen asynchron zueinander laufen sollen) und da Millisecs das Programm nicht ausbremst. Noch Fragen, Hauser ? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
morszeck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Lese mal die Onlinehilfe....
millisecs(x) gibt nur die momentane Zeit wieder, sonst nichts. Wen du eine Zeitabhängige Steuerung bauen willst, so musst du sie selber mit if...then und ein paar Variabeln programmieren. t=createtimer(x) und waittimer(t) ist eine aktive Zeitsteuerung, die aber wie delay(x) eine Wartesperre für das Programm ist. Delay(x) wartet aber grundsätzlich immer die Zeit ab und waittimer(t) wartet nur die allg. Zeitdifferenz ab... |
||
WinXpProf&SP2, B3D V1.88, B+ V1.40, BMax101Beta, AMD TB1.4GHz, DDR266/768MB, GeForce3@64MB |
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok jetzt habs sogar Ich kapiert ![]() ![]() Dann bedank ich mich nochma herzlich bei euch allen für eure Geduld und Hilfsbereitschaft und überleg mir was neues was ich nich versteh ![]() nein war natürlich nur n Scherz. Also big Thx und cu |
||
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jetzt wollte ich das ganze ausprobieren mit einem ganz simplen Code, der dann einmal/sekunde eine neue Zahl schreibt.
Aber was habe ich jetzt wieder verwechselt/vergessen/falsch gemacht? Code: [AUSKLAPPEN] Graphics 800,600 SetBuffer BackBuffer() sekunde=0 While Not KeyHit(1) timer=CreateTimer(60) If MilliSecs()>timer + 1000 timer=MilliSecs() Print sekunde + "Sekunde(n)" sekunde = sekunde + 1 EndIf Flip Wend End Tut mir leid das ich so doof bin ![]() ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Soweit schon richtig, aber CreateTimer nur einmal vor der Hauptschleife verwenden und die Variable timer nicht doppelt benutzen:Code: [AUSKLAPPEN] Graphics 800,600
So wird Dein Proggi auf 60 fps heruntergebremst und läuft auf (fast) jedem Rechner gleichschnell SetBuffer BackBuffer() fps=CreateTimer(60) ; verschoben und geändert sekunde=0 While Not KeyHit(1) WaitTimer(fps) ; damit das ganze einen Sinn macht If MilliSecs()>timer + 1000 timer=MilliSecs() Print sekunde + " Sekunde(n)" sekunde = sekunde + 1 EndIf ;Flip ; Im Fenstermodus flippt Windows selbst Wend End ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du wirfst da viel durcheinander:
Code: [AUSKLAPPEN] Graphics 800,600 SetBuffer BackBuffer() sekunde=0 lastTimeProbe = millisecs() While Not KeyHit(1) If MilliSecs() > lastTimeProbe + 1000 lastTimeProbe = MilliSecs() Print sekunde + "Sekunde(n)" sekunde = sekunde + 1 EndIf Flip Wend End oder Code: [AUSKLAPPEN] Graphics 800,600 SetBuffer BackBuffer() sekunde=0 timer = CreateTimer(1) While Not KeyHit(1) WaitTimer timer Print sekunde + "Sekunde(n)" sekunde = sekunde + 1 Flip Wend End die untere Methode ist aber für Spiele unschön, da die Schleife wirklich nur 1 mal pro Sekunde ablaufen würde, den Rest der Zeit würde das Programm "warten"... Naja, für Spiele ist das Obere sinnvoller, denn man kann die "Wartezeit" dafür verwenden alles flüßiger aussehen zu lassen etc. walski |
||
buh! |
Skullspliter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay Danke das mit waittimer hatte ich nich bedacht. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group