我使用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
}
}
答案 0 :(得分:2)
您正在使用的功能,以便存储事件SDL_WaitEvent()
,等待直到提供输入。这意味着如果没有提供输入,则该函数等待一个。换句话说,在您为此函数提供输入之前,不会执行后面的代码。
你想要的是一个不阻止程序的功能。在SDL中这样做的适当功能是SDL_PollEvent()
。如果没有给出输入,则该函数返回0而不是等待一个。