2011-01-10 21 views
1

ゲーム内に単純なタイマークラスがあり、エンティティに何秒も何度も何かをさせることができます。これは、2つの機能があります。それは、それを必要とするものでつかんできるようにC++クラスの複数のインスタンス間で共有されているタイマーカウンタの問題

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

これは単に経過時間グローバルを更新します。それはgameloopの中に置かれています。その後

重要な1:

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; 
    } 
} 

タイマーをタイマーとしてEntityクラス内でインスタンス化される::タイマータイマー

機能は、その後、エンティティの内部で呼ばれて::のインスタンスごとに一回のループごとに更新ゲーム内のエンティティクラス:

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

問題は、一度に一つだけやってのもので、その結果、エンティティのインスタンスごとに一意にカウントしていないようで、他の奇妙なものが時々起こっている。問題は共有されている静的変数のようです。このtCounter関数がそれを呼び出すインスタンスごとに一意の変数を保持するようにするにはどうすればよいですか?

+0

"問題は静的変数が共有されているようです。肯定的な側面では、 'Timer'クラスのメンバ変数として' ElapsedTime'を持っているようですので、そのロジックに従ってください。一方、それはあなたがより大きくより基本的な問題を持っているように見えます... –

答えて

0

この文脈でstaticは、一度に1つのインスタンスしか存在せず、一度初期化されることを意味します。私に

最も簡単な修正は(必ずしも最良の修正)に次のようになります。 - 静的な修飾子 を削除 - Timerftimenメンバ変数を作る - あなたがしたい各エンティティのためTimerのインスタンスを作成します。タイマーに反応する。

+0

ちょうどそれを本質的に試しました、そしてそれはうまく動作するようです。私は静的変数がどのように働いたのか誤解しました:/それをクリアするための乾杯! – Tel42

関連する問題