SDL Snake减速?

时间:2015-08-24 05:53:18

标签: c++ sdl-2

我一直在使用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;
            }
        }
    }

非常感谢任何帮助。感谢。

1 个答案:

答案 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