按下按键或移动鼠标时,游戏速度会减慢



最近我一直在尝试使用SDL编写我自己的游戏(太空入侵者的克隆),但我遇到了事件问题。。。我有两个事件,一个是由我的计时器发射的,我用它来绘制移动的敌舰。第二个事件是我的键盘事件,我用它来移动我的船。当我开始游戏时,敌人的飞船开始按照我的预期移动,但若我按下键或移动鼠标,它们的移动速度会变慢。我在移动我的飞船时也遇到了同样的问题,若我尝试移动鼠标,帧速率会降低很多。我的事件循环:

while(!exit)
{
    while(SDL_PollEvent(&event));
    {
        if(event.type == SDL_QUIT) exit=true;
        if(event.type == SDL_KEYDOWN)
        {
            switch(event.key.keysym.sym) 
            {
            case SDLK_LEFT:
                pship.move(pship.getPosition().x - 1, pship.getPosition().y);
                break;
            case SDLK_RIGHT:
                pship.move(pship.getPosition().x + 1, pship.getPosition().y);
                break;
            }
        }
        if(event.type == SDL_USEREVENT)
        {
            switch(event.user.code)
            {
            case 1:
                static int xOffset, yOffset;
                xOffset++;
                yOffset++;
                drawEnemyShips(eship,xOffset,yOffset);
                break;
            }
        }
    }
}

我使用Visual c++2010 express和SDL 1.2.15

while(SDL_PollEvent(&event));

你绝对不希望;出现在那里!按照你的方式,你在吃活动。如果您得到一个事件,SDL_PollEvent返回一个,所以您再次调用SDL_PollEvent。如果没有事件,你会跳出while循环并处理它。但如果有第二个事件,你永远不会处理第一个。

但无论如何,一个旋转的民意调查循环被打破了。这就像一个孩子每分钟都在问"我们到了吗",却不让父母开车。使用SDL_WaitEvent等待事件,而不是旋转CPU轮询等待事件。

一个简单的方法是改变:

while(SDL_PollEvent(&event));

到此:

while (SDL_WaitEvent(&event) != 0)

这将使您的代码有点笨拙(while循环仍然是不必要的,当您中断它时,您只需重新输入它),但至少它不会中断。

最新更新