我怎样才能实现一个计时器,在 C 中使用 sdl2 库,制作登月游戏
How can I implement a timer, using sdl2 libraries in C, making lunar lander game
我正在 C.I 中制作一个着陆器版本 (Atari 1979) 需要在我的游戏中实现一个计时器,然后在屏幕上打印。
我正在使用 SDLDrawLine,因为我有一个代表我的特征的向量。我需要我的代码 运行 一串字符,这很好。我使用 sprintf 函数将数字转换为字符串以在屏幕上打印出来。
char aux_str[MAX_VALUES];
sprintf(aux_str,"%d",*value);
for(j=0;j<strlen(aux_str);j++){
*tam_caracter_numero = letra_a_longitud(aux_str[j]);
*ptr_valor = letra_a_vector(aux_str[j]);
for(i=0;i<*tam_caracter_numero-1;i++){
SDL_RenderDrawLine(
renderer,
(*ptr_valor)[i][0] * escalado + pos_x,
-(*ptr_valor)[i][1] * escalado + pos_y,
(*ptr_valor)[i+1][0] * escalado + pos_x,
-(*ptr_valor)[i+1][1] * escalado + pos_y
);
}
这工作正常,但我需要我的计时器从 0000 开始,更改为 0001,0002,...。但是当我使用 sprintf 将我的数字转换为字符串时,结果仅为 1,并且没有t打印0s。有一些功能或某种方法可以使这成为可能吗?让从 0000 开始?
- 要打印前导零,只需在
sprintf
-语句中使用格式 "%04d"
而不是普通的 "%d"
。
- 考虑到整件事的计时,我建议您通读 Lazyfoos's SDL tutorials 关于计时器的内容。
要获取时间,请使用
SDL_GetTicks()
。这将获取自 SDL 初始化以来的毫秒数。有关详细信息,请参阅 man page。
要将它用作计时器,您必须获取自上次调用 SDL_GetTicks
以来的增量时间并更新它。
unsigned time = SDL_GetTicks();
while(game_is_running) { // Your game loop or whatever thread
// keeps track of time
unsigned now = SDL_GetTicks();
unsigned delta_time = now - time;
// Either delay next frame to get a stable FPS and/or use it as
// calculation in physics/collision
// Update the time
time = now;
}
SDL_GetTime
很昂贵,所以我不建议每个循环多次调用它。
Off-topic:我也不建议在循环中重复分配一个字符串。而是分配一次并覆盖每次迭代。
编辑:在我的 "off-topic" 评论中,我指的是 aux_str[MAX_VALUES];
,即使它是 1 条指令,但如果它在 OP 的游戏循环中,它仍然是不必要的。
我正在 C.I 中制作一个着陆器版本 (Atari 1979) 需要在我的游戏中实现一个计时器,然后在屏幕上打印。
我正在使用 SDLDrawLine,因为我有一个代表我的特征的向量。我需要我的代码 运行 一串字符,这很好。我使用 sprintf 函数将数字转换为字符串以在屏幕上打印出来。
char aux_str[MAX_VALUES];
sprintf(aux_str,"%d",*value);
for(j=0;j<strlen(aux_str);j++){
*tam_caracter_numero = letra_a_longitud(aux_str[j]);
*ptr_valor = letra_a_vector(aux_str[j]);
for(i=0;i<*tam_caracter_numero-1;i++){
SDL_RenderDrawLine(
renderer,
(*ptr_valor)[i][0] * escalado + pos_x,
-(*ptr_valor)[i][1] * escalado + pos_y,
(*ptr_valor)[i+1][0] * escalado + pos_x,
-(*ptr_valor)[i+1][1] * escalado + pos_y
);
}
这工作正常,但我需要我的计时器从 0000 开始,更改为 0001,0002,...。但是当我使用 sprintf 将我的数字转换为字符串时,结果仅为 1,并且没有t打印0s。有一些功能或某种方法可以使这成为可能吗?让从 0000 开始?
- 要打印前导零,只需在
sprintf
-语句中使用格式"%04d"
而不是普通的"%d"
。 - 考虑到整件事的计时,我建议您通读 Lazyfoos's SDL tutorials 关于计时器的内容。
要获取时间,请使用
SDL_GetTicks()
。这将获取自 SDL 初始化以来的毫秒数。有关详细信息,请参阅 man page。 要将它用作计时器,您必须获取自上次调用SDL_GetTicks
以来的增量时间并更新它。
unsigned time = SDL_GetTicks();
while(game_is_running) { // Your game loop or whatever thread
// keeps track of time
unsigned now = SDL_GetTicks();
unsigned delta_time = now - time;
// Either delay next frame to get a stable FPS and/or use it as
// calculation in physics/collision
// Update the time
time = now;
}
SDL_GetTime
很昂贵,所以我不建议每个循环多次调用它。
Off-topic:我也不建议在循环中重复分配一个字符串。而是分配一次并覆盖每次迭代。
编辑:在我的 "off-topic" 评论中,我指的是 aux_str[MAX_VALUES];
,即使它是 1 条指令,但如果它在 OP 的游戏循环中,它仍然是不必要的。