我怎样才能实现一个计时器,在 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 的游戏循环中,它仍然是不必要的。