Программа SDL2 останавливается, если мышь/клавиши не нажаты

Я программирую игру Snake на C, используя SDL2. Я пытаюсь заставить змею двигаться через некоторое время (500 мс или около того), и у меня есть часы, которые подсчитывают время, прошедшее, пока программа работает без полной остановки игры (вместо использования SDL_Delay, который делает это ).

Это функция:

float relogio (float segundos)
{
  clock_t start = clock();
  clock_t end = clock();
  float sec = (float)(end - start) / CLOCKS_PER_SEC ;
  sec=sec*1000+ segundos; //total time in seconds
  //printf("sec: %.02f\n", sec );

  return sec;
}

и в main.c

if(segundos>= delay) //delay is a variable. right now is at 0.5
    {
      segundos=0;
      moves(cobra, janela);
    }

Итак, моя проблема в том, что если моя мышь не перемещается внутри окна SDL или я не нажимаю клавиши, «бесконечный» цикл (пока переменная end_game = 0) останавливается через определенный период времени. Я вижу это в терминале, потому что, если я ничего не делаю через некоторое время, printf, который у меня есть в начале цикла, останавливается.

Как заставить программу продолжать работать, даже если я ничего не делаю в окне и не нажимаю клавиши?

Надеюсь, я понял, вот фрагмент моего цикла while в основной функции:

while(end_game==0)
  {
    printf("ciclo\n" ); // after a while this printf stops print and restarts if I press any key or move my mouse

                               //sdl related functions                      

    segundos=relogio (segundos);

    if(segundos>= delay)
    {
      segundos=0;
      //activates function that makes snake move a block in a certain direction
    }
    SDL_RenderPresent(g_pRenderer);                                                                 
  }

ИЗМЕНИТЬ

void game_end int *end_game, int mouse[])
{


  float l3 = 0.025 * LARG +120;             
  float l4 = 0.025 * LARG +200;              
  float sup = 0.2 * AC;
  float inf= 0.8 * AC;


  if(mouse[X] > l3 && mouse[X] < l4 && mouse[Y] > sup && mouse[Y] < inf)
  {
    *end_game = 1;
    game_over(); // this function quits SDL and all closes everything there is to close
  }

}                            

person CPP    schedule 09.03.2018    source источник
comment
Вы работаете на какой-либо виртуальной машине?   -  person aneesh jose    schedule 09.03.2018
comment
@aneeshjose да, Oracle VM Virtual Box, работающий с xubuntu   -  person CPP    schedule 09.03.2018
comment
Можете ли вы попробовать запустить это в родной ОС? Я думаю, что это проблема.   -  person aneesh jose    schedule 09.03.2018
comment
Мне нужно научиться это делать, так как я работал только с c в среде Linux. Я попытаюсь сделать это, когда вернусь домой.   -  person CPP    schedule 09.03.2018
comment
@CPP, как вы решаете, когда выйти (т. Е. При каком условии end_game устанавливается значение, отличное от 0 - скорее всего, вы выполняете это условие)? Кроме того, ваша функция синхронизации выглядит очень странно - взятие двух выборок часов сразу после другой, вероятно, даст одно и то же значение или, по крайней мере, очень близкое. Вам нужно сохранить предыдущую временную выборку и сравнить ее с текущей.   -  person keltar    schedule 09.03.2018
comment
@keltar прямо сейчас я меняю значение end_game только тогда, когда нажимаю кнопку, это единственное место, где я его меняю. Часы показывают маленькие цифры, но они отличаются от 0, я их добавляю и у меня в итоге получается вроде 500мс и змейка двигается   -  person CPP    schedule 09.03.2018
comment
@CPP подсказка заключалась в том, что ваша обработка нажатия кнопки, вероятно, неверна, поэтому вы получаете выход, когда не хотите. Без кода больше не могу сказать.   -  person keltar    schedule 09.03.2018
comment
@keltar Я почти на 100% уверен, что это не так. Переменная end_game устанавливается в 0 в начале основной функции и изменяется только от 0 до 1, а не наоборот. Если бы проблема была там, игра просто закрывалась бы, вместо того, чтобы продолжать работать, если бы я двигал мышью. Тем не менее, я отредактировал свой основной пост и добавил единственную часть кода, которая изменяет переменную конца игры.   -  person CPP    schedule 09.03.2018
comment
@CPP и код, который вызывает эту функцию? .. Если ваша проблема связана с событиями клавиш/мыши - очевидно, что наиболее важной частью здесь является цикл обработки событий. Или просто установите точку останова при выходе из функции.   -  person keltar    schedule 09.03.2018
comment
@keltar нашел проблему, она была как-то связана с событиями клавиш/мыши!!! Проблема была с функцией SDL_WaitEvent, которая была у меня в моей основной функции для обнаружения движений мыши и клавиш! Я заменил его на SDL_PollEvent, и теперь он работает нормально! Спасибо вам обоим за помощь!   -  person CPP    schedule 09.03.2018


Ответы (1)


Функция, которую вы используете для хранения событий, SDL_WaitEvent(), ожидает пока не будет предоставлен ввод. Это означает, что если ввод не предоставлен, функция ожидает его. Другими словами, пока вы не предоставите входные данные этой функции, следующий код не будет выполнен.

Вам нужна функция, которая не блокирует программу. Подходящей функцией для этого в SDL является SDL_PollEvent(). Когда ввод не дан, вместо ожидания одного эта функция возвращает 0.

person papillon    schedule 14.03.2018