Timer erstellen

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Skullspliter

Betreff: Timer erstellen

BeitragDi, Sep 07, 2004 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed

Bigmichi

BeitragDi, Sep 07, 2004 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 07, 2004 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Animationen ist das einzig wahre MilliSecs(). Bsp.:Code: [AUSKLAPPEN]
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

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
Fertich is die Laube Wink

Ich mach das immer so wenn ich solche Sachen nicht kapiere Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Shogo

BeitragDi, Sep 07, 2004 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 07, 2004 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

D2006

Administrator

BeitragDi, Sep 07, 2004 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Waittimer() gibts auch bei BlitzPlus. Events nutzt man ja eh nur bei Anwendungen (ich zumindest). MfG
 

Kekskiller

BeitragDi, Sep 07, 2004 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert aber laut der Online-Hilfe dort nicht mehr.
Daher bin ich der Meinung, dass WaitEvent() die bessere
Variante ist.
 

Skullspliter

BeitragDi, Sep 07, 2004 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy Very Happy Very Happy Very Happy Embarassed Embarassed Embarassed Embarassed

/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 Razz

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

BeitragDi, Sep 07, 2004 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 07, 2004 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber warum sind in den anderen Beispielen dann kein einziges mal diese speicher-variablen erwähnt worden? Rolling Eyes
 

morszeck

BeitragMi, Sep 08, 2004 0:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 08, 2004 7:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ja aber das beantwortet ehrlich gesagt nicht meine letzte Frage Embarassed
 

Dreamora

BeitragMi, Sep 08, 2004 8:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMi, Sep 08, 2004 8:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 08, 2004 8:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 08, 2004 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok jetzt habs sogar Ich kapiert Very Happy Embarassed

Dann bedank ich mich nochma herzlich bei euch allen für eure Geduld und Hilfsbereitschaft und überleg mir was neues was ich nich versteh Wink
nein war natürlich nur n Scherz.

Also big Thx
und cu
 

Skullspliter

BeitragDo, Sep 09, 2004 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed Crying or Very sad

Hubsi

BeitragDo, Sep 09, 2004 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit schon richtig, aber CreateTimer nur einmal vor der Hauptschleife verwenden und die Variable timer nicht doppelt benutzen:Code: [AUSKLAPPEN]
Graphics 800,600

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
So wird Dein Proggi auf 60 fps heruntergebremst und läuft auf (fast) jedem Rechner gleichschnell Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

walski

Ehemaliger Admin

BeitragDo, Sep 09, 2004 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 09, 2004 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay Danke das mit waittimer hatte ich nich bedacht.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group