如何使用C中的sdl2库实现计时器,制作月球着陆器游戏

时间:2019-05-20 22:23:48

标签: c printf sdl-2 c-strings

我正在用C制作着陆器摩尔版本(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,并且不打印de 0s。有某种功能可以使之成为可能吗?那从0000开始吗?

1 个答案:

答案 0 :(得分:0)

  • 要打印前导零,只需在"%04d"语句中使用格式"%d"而不是普通sprintf
  • 考虑到计时的整体性,我建议您对计时器进行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很昂贵,因此我不建议在每个循环中多次调用它。

离题:我也不建议在循环中重复分配字符串。而是分配一次并覆盖每次迭代。

编辑:在我的“偏离主题”注释中,我指的是aux_str[MAX_VALUES];,即使它是1条指令,如果它在OP的游戏循环中,也仍然没有必要。