Codesnippets > Code Snippets

Timer-Verwaltung

(1/1)

Quentin:
also ehrlich, ich finds nicht gut, wenn hier Posts einfach gelöscht werden. Man kann etwas klarstellen oder auch korrigieren, aber einfach streichen stinkt nach willkürlicher Zensur, und dabei ist's mir erst mal wurscht, ob das aus Sicht der Mods gerechtfertigt scheint oder auch nicht.

aber zum Thema:
Ich finde die Idee von Schranzi mit der Timer-Funktion gar nicht so verkehrt, vor allem wenn man damit mehrere Timer verwalten könnte. Ich habs damit mal versucht, wobei man sogar ohne GLOBALs auskommen kann ;). Dazu müssten die Timer aber erst einmal initialisiert werden. Das geht, indem man als Zeitdauer (millisec) einen negativen Wert mitgibt. Die Timernummern sollten bei Null starten


--- Code: GLBasic ---DeltaTimer(0, -1)
DeltaTimer(1, -1)
DeltaTimer(2, -1)

LOCAL counter1, counter2, counter3

WHILE TRUE
        IF DeltaTimer(0, 100) THEN INC counter1, 1
        IF DeltaTimer(1, 500) THEN INC counter2, 1
        IF DeltaTimer(2, 1000) THEN INC counter3, 1
        PRINT "1. Timer: " + counter1, 0, 0
        PRINT "2. Timer: " + counter2, 0, 20
        PRINT "3. Timer: " + counter3, 0, 40
        SHOWSCREEN
WEND


// ------------------------------------------------------------- //
// ---  DeltaTimer  ---
// num:         internal number of the timer
// millisec:    duration ot timer interval
//              millisec < 0 --> new timer is created
// ------------------------------------------------------------- //
FUNCTION DeltaTimer: num, millisec

        STATIC timer[]
       
        IF millisec <= 0
                DIMPUSH timer[], num
                timer[LEN(timer[])-1] = GETTIMERALL()
        ELSE
                IF num > LEN(timer[]) - 1 THEN RETURN FALSE
                IF timer[num] < GETTIMERALL()
                        timer[num] = GETTIMERALL() + millisec
                        RETURN TRUE
                ENDIF
        ENDIF
        RETURN FALSE

ENDFUNCTION // DELTATIMER
 

Schranz0r:
Danke Quentin!
Endlich mal einer, der selber schaut, das er was auf die Reihe bekommt.
Sehr lobenswert!

Hier ist auch wenigstens die Bezeichnung "DeltaTimer" gerechtfertig :)

Funktioniert super, und kommt ganz ohne Globals aus... sehr schön  :good:

Quentin:
Danke Schranz0r.
Trotzdem gilt meine Rüge noch, daß Löschen von Posts keine feine Art ist. Sonst läufst du Gefahr, zum BB-Mod zu mutieren ;) und das ist beileibe kein Fortschritt.

Schranz0r:
irgendwo muss man Ordung halten ;)

Quentin:
eine etwas andere Version, womit Timer noch einfacher zu handhaben sind, wie ich glaube.

- die Timer werden komplett innerhalb der Funktion DeltaTimer verwaltet und ist somit "gekapselt"
- Das Initialisieren vor der Hauptschleife entfällt.
- Auch kann die Nummerierung der Timer willkürlich sein

[EDIT]
wobei ich jedoch nicht weiß, ob es sinnvoll ist, wenn man Arrays innerhalb von Funktionen mit STATIC deklariert. Werden die dann im Stack abgelegt? Könnte das Speicherprobleme geben? Allerdings hab ich es mal spaßeshalber mit der Anlage von 10.000 Timern probiert. Lief problemlos.


--- Code: GLBasic ---// --------------------------------- //
// Project: DeltaTimer
// Start: Monday, August 04, 2008
// IDE Version: 5.341

// some constants for different timers
LOCAL SHIP = 10
LOCAL ENEMY01 = 11
LOCAL ENEMY02 = 12

LOCAL counter1, counter2, counter3

WHILE TRUE
        IF DeltaTimer(SHIP, 100) THEN INC counter1, 1
        IF DeltaTimer(ENEMY01, 500) THEN INC counter2, 1
        IF DeltaTimer(ENEMY02, 1000) THEN INC counter3, 1
        PRINT "1. Timer: " + counter1, 0, 0
        PRINT "2. Timer: " + counter2, 0, 20
        PRINT "3. Timer: " + counter3, 0, 40
        SHOWSCREEN
WEND


// ------------------------------------------------------------- //
// ---  DeltaTimer  ---
// num: internal number of the timer
// millisec: duration ot timer interval
// ------------------------------------------------------------- //
FUNCTION DeltaTimer: num, millisec

        TYPE t_timer
                number
                interval
        ENDTYPE
        STATIC timer[] AS t_timer
        LOCAL lt AS t_timer
       
        // set new timer interval if necessary
        FOREACH lt IN timer[]
                IF lt.number = num
                        IF lt.interval < GETTIMERALL()
                                lt.interval = GETTIMERALL() + millisec
                                RETURN TRUE
                        ELSE
                                RETURN FALSE
                        ENDIF
                ENDIF
        NEXT

        // this will only be executed if timer was not found yet
        // so we create a new one
        lt.number = num
        lt.interval = GETTIMERALL() + millisec
        DIMPUSH timer[], lt
        RETURN FALSE

ENDFUNCTION // DELTATIMER
 

Navigation

[0] Message Index

Go to full version