如果未按下鼠标/键,SDL2程序将停止

时间:2018-03-09 00:45:29

标签: c sdl-2

我使用SDL2在C中编写游戏Snake。我试图让蛇在一段时间后移动(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
  }

}                            

1 个答案:

答案 0 :(得分:2)

您正在使用的功能,以便存储事件SDL_WaitEvent(),等待直到提供输入。这意味着如果没有提供输入,则该函数等待一个。换句话说,在您为此函数提供输入之前,不会执行后面的代码。

你想要的是一个不阻止程序的功能。在SDL中这样做的适当功能是SDL_PollEvent()。如果没有给出输入,则该函数返回0而不是等待一个。