按键或移动鼠标时游戏速度变慢

时间:2012-08-21 13:19:24

标签: c++ events visual-c++ mouse sdl

最近我一直在尝试使用SDL编写自己的游戏(Space Invaders的克隆版),但我遇到了一些问题...... 我有两个事件,一个由我的计时器发出,我用它来画出移动的敌人船只。第二个事件是我用来移动我的船的键盘事件。 当我开始游戏时,敌舰开始完全按照我的预期移动,但如果我按下键或移动鼠标,它们会移动得更慢。移动我的船时遇到同样的问题,如果我试图移动鼠标,帧速率会慢下来。 我的事件循环:

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

1 个答案:

答案 0 :(得分:6)

while(SDL_PollEvent(&event));

你绝对不希望;在那里!你拥有它的方式,你正在吃事件。如果您收到某个活动,SDL_PollEvent会返回一个活动,因此您再次致电SDL_PollEvent。如果没有事件,则跳出while循环并处理它。但如果有第二个事件,你永远不会处理第一个事件。

但无论如何,一个旋转的轮询循环被打破了。这就像那个孩子每分钟都在问“我们在哪里”而且不让父母开车。使用SDL_WaitEvent等待事件,而不是将CPU轮询旋转为1。

一种简单的方法是改变:

while(SDL_PollEvent(&event));

到此:

while (SDL_WaitEvent(&event) != 0)

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