我一直在使用SDL克隆Snake,但我发现当我运行游戏时它会慢下来。蛇开始移动的速度非常快,但经过几次转弯后,它会慢慢减速。我一直试图找出原因,但不能。 :( 我认为它与我试图实现FPS的方式或更新游戏功能(发生键处理)有关。
这是我尝试实施FPS的地方:
void run(){
int SKIP_TICKS;;
long next_game_tick = time(0);
long sleep_time = 0;
std::cout<<next_game_tick<<std::endl;
while (!quit){
SKIP_TICKS = 1000 / fps;
updateGame();
render();
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - time(0);
sleep_time *= 10;
usleep(sleep_time);
}
}
这是我的更新游戏功能:
void updateGame(){
SDL_Event event;
if (!isFrutActive){
doNewFruit();
}
while (SDL_PollEvent(&event)){
if (event.type == SDL_QUIT){
quit = true;
}
if (event.type == SDL_KEYDOWN){//Get keyboard input
switch (event.key.keysym.sym){
case SDLK_ESCAPE: quit = true; break;
case SDLK_UP:
case SDLK_w:
ydir = -SPEED;
xdir = 0;
break;
case SDLK_DOWN:
case SDLK_s:
ydir = SPEED;
xdir = 0;
break;
case SDLK_LEFT:
case SDLK_a:
xdir = -SPEED;
ydir = 0;
break;
case SDLK_RIGHT:
case SDLK_d:
xdir = SPEED;
ydir = 0;
break;
}
}
}
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
我相信我已经找到了解决问题的方法,当我按下X时,sleep_time被设置为负数。这是我的新代码:
void run(){
int SKIP_TICKS;
long next_game_tick = SDL_GetTicks();
long sleep_time = 0;
while (!quit){
SKIP_TICKS = 1000 / fps;
updateGame();
render();
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - SDL_GetTicks();
std::cout<<sleep_time<<std::endl;
sleep_time *= 1000;
if (sleep_time >= 0){
usleep(sleep_time);
}
else{
next_game_tick += SKIP_TICKS;
}
}
}
通过使用if语句,如果sleep_time低于零,我避免使用usleep(sleep_time)。 非常感谢帮助我的人们! :d