【发布时间】:2009-12-01 04:02:59
【问题描述】:
我的业余爱好是在 C++ 中使用 OpenGL 和 SDL 在 C++ 中构建一个 3d 游戏,并希望了解更多关于这个编程领域的信息。
想知道在游戏运行时模拟时间的最佳方式。显然我有一个看起来像这样的循环:
void main_loop()
{
while(!quit)
{
handle_events();
DrawScene();
...
SDL_Delay(time_left());
}
}
我正在使用 SDL_Delay 和 time_left() 来保持大约 33 fps 的帧速率。
我原以为我只需要一些全局变量,比如
int current_hour = 0;
int current_min = 0;
int num_days = 0;
Uint32 prev_ticks = 0;
然后是这样的函数:
void handle_time()
{
Uint32 current_ticks;
Uint32 dticks;
current_ticks = SDL_GetTicks();
dticks = current_ticks - prev_ticks; // get difference since last time
// if difference is greater than 30000 (half minute) increment game mins
if(dticks >= 30000) {
prev_ticks = current_ticks;
current_mins++;
if(current_mins >= 60) {
current_mins = 0;
current_hour++;
}
if(current_hour > 23) {
current_hour = 0;
num_days++;
}
}
}
然后在主循环中调用handle_time()函数。
它编译并运行(此时使用 printf 将时间写入控制台)但我想知道这是否是最好的方法。有没有更简单或更有效的方法?
【问题讨论】:
-
“只需要一些全局变量” - 不要。几乎总是有更好的选择,例如
struct包含信息并被传递。 -
你到底想做什么?我没有尝试过 SDL,但滴答声会取决于处理器速率还是总是锁定到毫秒?您想每 30 秒模拟一分钟吗?
-
SDL_GetTicks -- 获取自 SDL 库初始化以来的毫秒数。基于此,我尝试每 30 秒模拟一分钟。
-
像时间一样的全局状态,它被无处不在的所有事物所使用,真的应该在一个全局变量中。否则,您必须将“当前时间和帧数”结构传递给整个游戏中的每个函数。
-
假设整个游戏需要当前时间和帧数,我很确定它不需要。以我的经验,我在主循环中获得时间并将其传递给更新函数,就是这样。很少有地方真正需要这些数据。