Как я могу реализовать таймер, используя библиотеки sdl2 в C, делая игру Lunar Lander - PullRequest
1 голос
/ 21 мая 2019

Я делаю версию крота (Atari 1979) в C. Мне нужно включить таймер в моей игре, а затем напечатать на экране.

Я использую 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 и не печатается де 0с. Есть какая-то функция или способ сделать это возможным? Что пусть начнется в 0000?

1 Ответ

0 голосов
/ 21 мая 2019
  • Чтобы напечатать ведущие нули, просто используйте формат "%04d" вместо простого "%d" в вашем sprintf утверждении.
  • Из-за времени все это я бы рекомендовал пройти Уроки Lazyfoos по SDL о таймерах.Чтобы получить время, используйте SDL_GetTicks().Это будет время в миллисекундах с момента инициализации SDL.См. справочную страницу для более подробной информации об этом.Чтобы использовать его в качестве таймера, вы должны получить дельта-время с момента последнего вызова 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 стоит дорого, поэтому я бы не рекомендовал вызывать егоболее одного раза за цикл.

Не по теме: я также не рекомендовал бы повторно размещать строку в цикле.вместо этого выделяйте один раз и перезаписывайте каждую итерацию.

edit: В моем "не по теме" -комментарии я имею в виду aux_str[MAX_VALUES];, хотя это 1 инструкция, но она по-прежнему не нужна, если она находится внутри gameloop OP.

...