Verzögerung (Timer)

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Kleiner satan

Betreff: Verzögerung (Timer)

BeitragSo, Jul 09, 2006 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich hab die boardsuche und google schon durchsucht aba nix brauchbares gefnden!
meine frage ist wie mache ich nen timer und ne uhr die die sekunden zählen kann???
(bitte so einfach wie möglich erklären)

bastian

Christoph

BeitragSo, Jul 09, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:millisecs()

Dieser Befehl zählt die Millisekunden, die seit dem letzten Start Windows verstrichen sind.

Also:
Code: [AUSKLAPPEN]
graphics 640,480,32,1
setbuffer backbuffer()

Start=millisecs()

repeat
  cls
  text 0,0,"Es sind "+((millisecs()-Start)/1000)+" Sekunden vergangen."
  flip
until keydown(1)

Kleiner satan

BeitragSo, Jul 09, 2006 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm...ok danke
ich versuche mal damit ws anzufangen


EDIT: also ich habs jetzt geschaft es zu verstehen *freu*
aber wie mach ich das das zu nen countdown wird?
wenn ich zu start 60 sekunden hunzufüge kommt ja ne negative zahl rauß!
und das is blöd wenn da n minus steht!
wie kann ich das ändern?
 

Kaplan

BeitragSo, Jul 09, 2006 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Na ja das ist einfach.
Initialisiere eine Variable genannt millisec mit 60, eine genannt secs mit 60 und eine genannt min mit maximal 60.
Dann einfach der Variable millisecs immer 1 abziehn, wenn diese bei Null angekommen ist den Wert wieder auf 60 setzen und secs 1 abziehen. Wenn secs bei Null angekommen ist, ihren Wert wieder auf 60 setzen und min eins abziehen.

Code: [AUSKLAPPEN]

Graphics 640,480
setbuffer backbuffer()

;Die 3 Variablen
millisec = 60
secs = 60
min = 2

;Hautpschleife
Repeat
cls
millisec = millisec - 1
if millisec = 0 then
millisec = 60
secs = secs -1
end if
if secs = 0 then
secs = 60
min = min - 1
end if
if min = 0 then
locate 0,40
print "Countdown wurde beendet."
end if

locate 0,20
print ""+min+" "+ secs +" "+millisec
Flip

until keydown(1)
end

"Jedes Ereigniss hinterlässt eine Narbe in der Seele des Beteiligten. Manche sind größer als andere, manche aber teilen deine Seele in Zwei."


User posted image
User posted image

Kleiner satan

BeitragSo, Jul 09, 2006 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
äh...versteh ich das ichtig das eine sekunde einen durchlauf entspricht???

StepTiger

BeitragSo, Jul 09, 2006 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ist auch ein bissl doof erklärt. Ein Durchlauf entspricht natürlich keiner millisekunde

wie wäre es damit:
millisecs()+60000
also 60.000 millisekunden drauf
das entspricht 60 sekunden

und dann guckst du so:
Code: [AUSKLAPPEN]
x=MilliSecs()+60000
While Not KeyDown(1)
   SetBuffer BackBuffer()
   Cls
   remain=(x-MilliSecs())/1000; verbleibende Zeit errechnen
   Text 1,1,"Es sind noch "+remain+" Sekunden"; ausgeben auf dem bildschirm
   Delay 10; damit das programm den speicher nicht auslastet
   If remain<=0 Then WaitKey:End
   Flip
Wend
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Kleiner satan

BeitragSo, Jul 09, 2006 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
höhö
ich habs jetzt selbst geschaft (aber nur wegen eurer hilfe!)

Code: [AUSKLAPPEN]

start = MilliSecs()/1000
start = start + 60
Repeat
Cls
aktuell = MilliSecs()/1000
time = start - aktuell
Print time
Until KeyHit(1)
End


euro code fand ich etwas unübersichtig!
bitte mekkert jetzt nicht rum weil ich diesen kram mit flip und graphics benutz hab!
 

Kaplan

BeitragSo, Jul 09, 2006 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleiner satan hat Folgendes geschrieben:
äh...versteh ich das ichtig das eine sekunde einen durchlauf entspricht???

Nein, eine Sekunde entsprechen 60 Durchläufe der Hauptschleife. Da der Variable secs nur 1 abgezogen wird, wenn die Variable millisec mit dem Wert 0 versehen ist. Da pro Durchlauf der Variable millisec nur 1 abgezogen wird, benötigt es 60 Durchläufe um secs 1 abzuziehen, und 360 Durchläufe, um der Variable min 1 abzuziehen.
"Jedes Ereigniss hinterlässt eine Narbe in der Seele des Beteiligten. Manche sind größer als andere, manche aber teilen deine Seele in Zwei."


User posted image
User posted image

StepTiger

BeitragSo, Jul 09, 2006 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
der code stimmt auch so nicht, da man nie weiß, wie lange der code benötigt, um die kommandos durchzuführen
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Ret

BeitragSo, Jul 09, 2006 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Machs doch so....(geht ja auch^^)

Code: [AUSKLAPPEN]
Zahl = 10

Repeat
Cls
   Text 100,100,Zahl
   
   If MilliSecs()> Timer +1000 Then;Timer einstellen jede 100 secunden aktivieren
      Timer = MilliSecs()
      Zahl =Zahl -1
      If Zahl < 0 Then Exit;Bei Null zum Ende springen
   End If
   
Flip
Until KeyHit(1)

Print "Countdown Ende"


mfg Ret
Blau? Chili? was das?
www.bluechiligamez.de.vu
www.bluechiligamez.de.vu
"Wichtig ist das man nie aufhöhrt zu fragen"Albert einstein

Christoph

BeitragMo, Jul 10, 2006 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@Ret
Deine Uhr ist nicht genau.
1. Deine Uhr ist zu langsam (was bei größeren Zeitspannen zum Problem werden kann)
2. Deine Uhr zählt nicht von der Zahl ab, die angegeben wurde sondern von der Zahl-1

Hier ein Beispiel, die (zumindest auf meinem PC) den Zeitunterschied zeigt:
Code: [AUSKLAPPEN]
Zahl = 0
Zahl2= 0
Start=MilliSecs()
Repeat
Cls
   If MilliSecs()> Timer +1000 Then;Timer einstellen jede 100 secunden aktivieren
      Timer = MilliSecs()
      Zahl =Zahl +1
   EndIf
   Zahl2=Zahl2+(MilliSecs()-Start)
   Start=MilliSecs()
   Text 100,150,"Genaue Zeit: "+(Zahl2/1000)
   Text 100,100,"Ungenauere Zeit: "+Zahl   
   Flip
Until KeyHit(1)


Bei mir ist nach ungefähr einer Minute der Genauere Zeitzähler vor dem ungenaueren, obwohl dieser eine Sekunde später startete als der 2. Zeiger->s. Punkt2.

Grund von Punkt1:
Deine Uhr überprüft immer wenn sie an dem Abschnitt
Code: [AUSKLAPPEN]
If MilliSecs()> Timer +1000 Then;

angelangt ob die Zeit GRÖSSER als eine Sekunde ist. Dadurch fallen pro Durchlauf immer ein paar Millisekunden unter den Tisch
->Die Uhr wird mit der Zeit ungenau.

Grund von Punkt2:
Timer ist am Anfang 0. D.h. Timer+1000=1000. Wer kann ein Programm in weniger als einer Sekunde nach dem Start Windows ausführen?
Niemand, also ist millisecs()>Timer+1000. Was passiert?
Zahl wird im ersten Durchlauf um eins kleiner.

kamehan

BeitragFr, Jul 21, 2006 4:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ich brauch einen timer für die hier erklärte situation:

ich führe eine bestimmte aktion aus, dann läuft ein unsichtbarer timer für 3 sekunden.
wenn die selbe aktion in den 3 sekunden erneut ausgeführt wird, soll zum beispiel irgendein sonderbarer klang zu hören sein und ein neuer timer beginnt bis 3 zu zählen.
wird in dieser zeit NOCHMAL diese aktion durchgeführt, sollte wieder ein klang zu hören sein, nur ein anderer (noch sonderbarer) und immer so weiter...

ich hab leider nur keine ahnung wie ich das anstellen soll Sad
kann mir dabei bitte einer helfen?
 

Skulk

BeitragFr, Jul 21, 2006 8:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das folgende beispiel kannst du leicht erweitern in dem du je eine weitere Case-Abfrage einfügst

Code: [AUSKLAPPEN]
iTimerLast   = 3000   ; Millisekunden bis zum nächsten Event
iEventCount   = 0      ; Anzahl Events die bereits ausgelöst wurden

iStartTime = MilliSecs()   ; Timer starten

While Not KeyHit(1)
   If iStartTime + iTimerLast <= MilliSecs() Then
      ; es sind 3 Sekunden vergangen
      iEventCount = iEventCount + 1      ; Eventzähler um eins erhöhen
      iStartTime = MilliSecs()         ; StartTime zurücksetzen und auf die nächsten 3 sec warten
      
      ; iEventCount auswerten
      Select iEventCount
         Case 1
            Print "Event Nummer eins ausgelöst - spiele Klang"
         Case 2
            Print "Event Nummer zwei ausgelöst - spiele Klang"
         Case 3
            Print "Event Nummer drei ausgelöst - spiele Klang"
         Case 4
            Print "Event Nummer vier ausgelöst - spiele Klang"
                        
      End Select
   End If
Wend
War doesn't determine who's right,
war determines who's left...

kamehan

BeitragFr, Jul 21, 2006 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ah das sieht sehr gut aus, danke, werde es aber sofort nicht einbauen können aber wird machbar sein, denke ich

StepTiger

BeitragFr, Jul 21, 2006 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte irgendwie, das wäre mehr so gemeint:
Code: [AUSKLAPPEN]
waittime=3000
lasttime=MilliSecs()
countevents=0

blabla=LoadSound("E:\rocks.wav")

Print blabla

SetBuffer BackBuffer()
While Not KeyDown(1)
   Cls
   If KeyHit(57) Then event=1
   If event=1
      event=0
      If MilliSecs()<lasttime+waittime
         countevents=countevents+1
         lasttime=MilliSecs()
         SoundPitch blabla,32000*(1+(countevents)*.125)
         PlaySound(blabla)
         Print "Bong"
      Else
         countevents=1
         lasttime=MilliSecs()
         SoundPitch blabla,32000*1.125
         PlaySound(blabla)
         Print "Bong"
      EndIf
   EndIf
   Flip
   Delay 1
Wend


einfach mal schnell hintereinander drücken und dann mal 3 sekunden warten
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Skulk

BeitragFr, Jul 21, 2006 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
oh stimmt, da hab ich wohl nicht gescheit gelesen....
War doesn't determine who's right,
war determines who's left...

kamehan

BeitragFr, Jul 21, 2006 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm was nehm ich da jetzt, große auswahl o.O
ne ok, der 2. sieht logischer aus also danke nochmal!!!
 

Skulk

BeitragFr, Jul 21, 2006 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
das zweite ist auch richtiger Smile

ich hatte es so verstanden:
löse alle 3 sekunden an anderes event aus und spiele einen "seltsamen ton" ab.
War doesn't determine who's right,
war determines who's left...

kamehan

BeitragFr, Jul 21, 2006 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
lol.."seltsam" xD
na gut vielleicht hab ichs ein bissl dumm erklärt...

StepTiger

BeitragFr, Jul 21, 2006 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ach mit viel fantasie ist alles richtig ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group