Seite 2 von 2

Verfasst: 10.04.2005 00:05
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.

Verfasst: 10.04.2005 00:36
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?

Verfasst: 10.04.2005 00:47
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

Verfasst: 10.04.2005 01:31
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

Verfasst: 10.04.2005 01:56
von zigapeda
Ok danke ich glaube jetzt weiß ich alles. thx

Verfasst: 10.04.2005 03:16
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()

Verfasst: 10.04.2005 17:01
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???

Verfasst: 10.04.2005 19:21
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.