Timer

Anfängerfragen zum Programmieren mit PureBasic.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@MVXA
Ich wollt vielmehr damit sagen, daß wir aus der Info schlecht beurteilen können, wie genau der Timer sein soll (wobei es auf rundenbasierend hindeutet und der Timer deswegen scheinbar nicht so genau sein muß). Jedoch spricht wohl kaum etwas dagegen, eine genauere Variante zu zeigen und für diese ist nun mal eine höhere Priorität nötig.
Zuletzt geändert von THEEX am 10.04.2005 00:45, insgesamt 1-mal geändert.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Das Spiel wird ähnlich wie Moorhuhn und man hat 2 Minuten zeit Punkte zu machen also braucht das nicht so genau zu sein. Jetzt hab ich aber noch eine frag: Ich möchte die verbleibende Zeit anzeigen, wie würde ich das bei der methode mit elapsedmilliseconds() machen?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

oh, ich würde einfach alle 100 Milliseconds (oder halt jede Sekunde, ich bin mir mit der Zahl nicht so sicher) den Zähler eins hoch stellen, bzw. eine Sekunde von den 2 Minuten abziehen.

Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Code: Alles auswählen

Procedure Timer()
  Static Start
  If Start = 0
    Start = ElapsedMilliseconds()
  Else
    ProcedureReturn (ElapsedMilliseconds() - Start) / 1000   
  EndIf
EndProcedure

If InitSprite() And OpenWindow(0, 0, 0, 120, 120, #PB_Window_ScreenCentered|#PB_Window_SystemMenu, "Timer") And OpenWindowedScreen(WindowID(0), 5, 5, 110, 110, 0, 0, 0)
  Repeat
    Time = 120 - Timer()
    If Time < 0
      Time = 0
    EndIf
  
    Event = WindowEvent()
    If Event = #PB_EventCloseWindow
      End
    EndIf
  
    StartDrawing(ScreenOutput())
      Locate(45, 45): DrawText(Str(Time))
    StopDrawing()
    FlipBuffers()
    ClearScreen(0, 0, 0)
  ForEver
EndIf
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Ok danke ich glaube jetzt weiß ich alles. thx
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@CSprengel

wenn er von zwei minuten spricht, geh ich einfach mal davon aus,
daß eine abweichung um ~13 Millisekunden nicht so kritisch ist.

und Danilos Hi-Res-Timer funktioniert auch dann zuverlässiger als ElapsedMilliseconds,
wenn man die Prozesspriorität nicht hochsetzt.

weiter:
schick, ne selbststartende Proc zu entwerfen,
leider ist sie aber nur einmal verwendbar,
weil du keine möglichkeit zum zurücksetzen
der Static Start implementiert hast.
(sorry, klang jetzt arg sarkastisch. deine proc ist gut, aber ein reset wär nützlich)

Zeitverfolgung:
damit sich Fehler nicht addieren, kann man auch nen fixwert zum zwischenwert addieren.

Code: Alles auswählen

ActTime = ElapsedMilliseconds + 1000
an den Anfang. Dann in die Schleife:

Code: Alles auswählen

If ElapsedMilliseconds > ActTime
    ActTime + 1000 ; (*)
    Sec +1
    If Sec > 59
        Sec = 0
        Min +1
    EndIf
EndIf
(*) dadurch addiert sich die abweichung nicht auf.
Immer wenn eine Sec voll ist, wird auf die nächste gewartet,
die Aktualisierung kann abweichen, aber nicht die Gesamtzeit.

Anzeige:

Code: Alles auswählen

StartDrawing(ScreenOutput())
    Locate(TimX,TimY)
    DrawText(Right("00"+Str(Min),2)+":"+Right("00"+Str(Sec),2))
StopDrawing()
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

wenn er von zwei minuten spricht, geh ich einfach mal davon aus,
daß eine abweichung um ~13 Millisekunden nicht so kritisch ist.
Es kann garantiert auch Gründe geben (wenn jetzt wohl auch nicht gerade hier), wo es sehr genau 2 min sein sollten, wobei ich schon vorher geschrieben hab, daß es ja wohl kaum etwas schadet, eine etwas genauere Möglichkeit zu zeigen...
schick, ne selbststartende Proc zu entwerfen,
leider ist sie aber nur einmal verwendbar,
weil du keine möglichkeit zum zurücksetzen
der Static Start implementiert hast.
(sorry, klang jetzt arg sarkastisch. deine proc ist gut, aber ein reset wär nützlich)
Ist auch mir bewußt, daß es nur einmal verwendtbar ist, wie es mehrmals verwendtbar ist, hab ich vorher schon gezeigt. Desweiteren wollt ich den Code recht einfach halten und wenn man beim Ablauf der Zeit den Ausgangspunkt wieder zurück setzt, würde der Code leicht komplizierter aussehn.

Und wo sollte eine Abweichung entstehn???
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

CSprengel hat geschrieben:Und wo sollte eine Abweichung entstehn???
bei deiner proc entsteht keine abweichung, da du ja nicht fortlaufend differenzen bearbeitest,
sondern den wert intern Static verwaltest. ist schon in ordnung.

aber da man bei millisekundenverwaltung eben oft so etwas sieht:

Code: Alles auswählen

If ElapsedMilliseconds() > Timer + Diff
    Timer = ElapsedMilliseconds()
EndIf
wollte ich nur anmerken, daß man besser durch addition eines fixwertes aktualisiert,
als duch angleichung an die aktuelle Millisekunde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten