【问题标题】:How can I implement a timer, using sdl2 libraries in C, making lunar lander game如何实现计时器,在 C 中使用 sdl2 库,制作月球着陆器游戏
【发布时间】:2019-10-07 07:03:18
【问题描述】:

我正在用 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 年开始?

【问题讨论】:

  • 我试过这个,但它不起作用。首先,我的问题不包括 printf 函数,而是 sprintf。然后我的问题不是在屏幕上打印,而是我必须从 0001(作为数字)传递到一串字符(使用 sprintf),然后使用 sdl2 函数将其打印在我的游戏屏幕上。当干草在 0001 上使用 sprintf 时,我得到一个 1。
  • printf 和 sprintf 的格式字符串说明符是一样的。

标签: c printf sdl-2 c-strings


【解决方案1】:
  • 要打印前导零,只需在您的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 很昂贵,所以我不建议每个循环多次调用它。

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

编辑:在我的“离题”评论中,我指的是aux_str[MAX_VALUES];,即使它是 1 条指令,如果它在 OP 的游戏循环中仍然是不必要的。

【讨论】:

  • 你在题外话中写错了。在哪里引入一个字符数组并不重要,因为在任何情况下,这个数组都会在函数执行开始时分配一次(在堆栈上)。
  • 不,我不是。这是对性能的关注。对于 cpu 来说,分配 + 写入字节到数组比仅覆盖现有数组更重。希望编译器已经发现了这个小缺陷并预先分配了数组。 -- 这也是我们不在每个循环开始时创建新变量以保持时间的部分原因。
  • 你指的是什么字符串分配?我在您发布的代码或 OPs 代码中都没有看到任何内容。而且我不明白“在每个循环开始时创建一个新变量”评论。你能澄清你指的是什么吗?谢谢。
  • “分配”是什么意思? char aux_str[MAX_VALUES]; - 是一条 CPU 指令,不依赖于代码中您声明它的位置。它不是动态分配(代价高昂),而是堆栈分配(不是)。
  • 对不起,我是新来的,我忘了做,我用绿色标记,够了吗?还是我必须做其他事情?非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多