2011-01-10 2 views
1

Ich habe eine einfache Timer-Klasse in einem Spiel, die es mir ermöglichen soll, eine Entity so viele Sekunden lang etwas machen zu lassen. Es hat zwei Funktionen:C++ Problem mit dem Timer-Zähler, der zwischen mehreren Instanzen einer Klasse geteilt wird

void Timer::GameTimer() // Gets time between frames 
{ 
    ::ElapsedTime = Clock.GetElapsedTime(); 
    Clock.Reset(); 
} 

Dies aktualisiert nur die ElapsedTime Global, so dass es von allem ergriffen werden kann, die es benötigt. Es ist in der Gameloop platziert.

Dann das wichtig:

bool Timer::tCounter(int total) // Returns true every 'total' seconds 
{ 
    static float ftime; // Variable to hold the mounting elapsed time 
    static int n; // Counter variable for true trigger 

    ftime += ElapsedTime; 

    int itime = (int)ftime; //Truncate 

    if(!(itime%total) && itime != 0) 
    { 
     n++; 
    } 
    else 
    { 
     n = 0; 
    } 

    if (n == 1) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Timer ist in der Entity-Klasse instanziiert als Timer :: Timer Timer

Die Funktion dann in Entity aufgerufen :: Update einmal pro Schleife für jede Instanz die Entity-Klasse im Spiel:

if (timer.tCounter(2)) 
    { 
     Do stuff 
    } 

das Problem ist es nicht eindeutig für jede Instanz von Entity zu zählen scheint, zu einer Zeit, in nur eine tun Sachen resultierenden und manchmal passieren andere seltsame Dinge. Das Problem scheint, dass die statischen Variablen geteilt werden. Wie stelle ich sicher, dass diese tCounter-Funktion eindeutige Variablen für jede Instanz enthält, die sie aufruft?

+0

"Das Problem scheint zu sein, die statischen Variablen zu teilen": Sie haben das richtig verstanden. Auf der positiven Seite sieht es so aus, als ob Sie 'ElapsedTime' als Member-Variable für die' Timer'-Klasse haben. Folgen Sie einfach dieser Logik. Auf der anderen Seite sieht es so aus, als ob Sie größere und einfachere Probleme haben ... –

Antwort

0

Statisch bedeutet in diesem Kontext, dass immer nur eine Instanz von etwas existiert und einmal initialisiert wird.

Die einfachste Lösung, um mich zu (nicht unbedingt die beste fix) wäre: - Entfernen Sie die statische Qualifier - Erstellen Sie eine Instanz von Timer für jede Entität, die Sie wollen - ftime und n Membervariablen von Timer machen reagiere auf einen Timer.

+0

Ich habe es einfach im Wesentlichen versucht, und es scheint gut zu funktionieren. Ich habe missverstanden, wie statische Variablen funktionieren:/Cheers, um es aufzuräumen! – Tel42

Verwandte Themen