2011-01-10 72 views
1

我在游戏中有一个简单的计时器类,旨在让我能够让实体每隔几秒钟做一件事。它有两个功能:C++在一个类的多个实例之间共享定时器计数器的问题

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

这只是更新了ElapsedTime Global,以便它可以被任何需要的东西抓住。它放在gameloop里面。

那么重要的一个:

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

定时器是实体类中实例化定时器::定时器定时

的功能,然后调用内部实体::更新每循环一次的每个实例在游戏中的实体类:

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

问题是,它似乎并没有独特的计数实体的每个实例,导致只有一个做的东西的时间和其他奇怪的事情偶尔会发生。这个问题似乎是被共享的静态变量。我如何确保这个tCounter函数为每个调用它的实例保存唯一变量?

+0

“问题似乎是共享的静态变量”:你说得对。在积极的方面,它看起来像``ElapsedTime`作为`Timer`类的成员变量,所以只需遵循该逻辑即可。另一方面,它看起来像你有更大和更基本的问题... – 2011-01-10 19:27:27

回答

0

静态在这种情况下意味着一次只存在一个事物的一个实例并初始化一次。

的最简单的解决对我将是(不一定是最好的解决): - 删除静态预选赛 - 使Timer ftimen成员变量 - 创建要的Timer为每个实体的实例对计时器做出反应。

+0

只是基本上尝试过,而且它似乎很好地工作。我误解了静态变量的工作原理:/干杯清理它! – Tel42 2011-01-10 19:37:18

相关问题