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

nor*_*108 1 c++ mouse events sdl visual-c++

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

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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*rtz 6

while(SDL_PollEvent(&event));
Run Code Online (Sandbox Code Playgroud)

你绝对不希望;那里!你拥有它的方式,你正在吃事件.如果您收到活动,请SDL_PollEvent返回一个活动,SDL_PollEvent然后再次致电.如果没有事件,你就会突破while循环并处理它.但如果有第二个事件,你永远不会处理第一个事件.

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

一个简单的方法是改变:

while(SDL_PollEvent(&event));
Run Code Online (Sandbox Code Playgroud)

对此:

while (SDL_WaitEvent(&event) != 0)
Run Code Online (Sandbox Code Playgroud)

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

  • 空的`while`循环没有任何违法行为,使用大括号创建无条件范围也没有任何问题. (3认同)