SDL 2.0 - 鼠标移动是spaming事件队列

时间:2014-01-09 22:14:21

标签: events queue mouse sdl sdl-2

正如Tittle所说,鼠标移动是游戏事件队列,所以当我摇动鼠标时我不能走路。有什么办法吗?只有鼠标或其他东西的不同队列。

SDL_Event event_;
    CInputManager::Instance()->SetEvent(&event_);
    InitializeGameFiles();
    while (running)
    {
        if (SDL_PollEvent(&event_))
        {
            if (event_.type == SDL_QUIT)
            {
                running = false;
            }
            else if (event_.type == SDL_MOUSEMOTION)
            {
                CCrosshair::Instance()->OnUpdate();
            }
        }
        OnUpdate(SDL_GetTicks() - currentTime);
        currentTime = SDL_GetTicks();
        OnRender();
    }

void OnUpdate(unsigned int deltaTime)
{
    //Game logic here
    CInputManager* IM = CInputManager::Instance();
    CPlayer* player = &CPlayer::PlayerControl;
    IM->UpdateHeyHeld();
    if (IM->IsKeyDown(SDLK_w))
    {
        cam[1] += speed * (deltaTime / 1000.f ); 
    }
    else if (IM->IsKeyDown(SDLK_s))
    {
        cam[1] -= speed * (deltaTime / 1000.f ); 
    }

    if (IM->IsKeyDown(SDLK_a))
    {
        cam[0] += speed * (deltaTime / 1000.f );
    }
    else if (IM->IsKeyDown(SDLK_d))
    {
        cam[0] -= speed * (deltaTime / 1000.f ); 
    }

    if (IM->IsKeyDown(SDLK_q))
    {
        player->OnRotate(- (int) asp * (deltaTime / 1000.f) );
    }
    if (IM->IsKeyDown(SDLK_e))
    {
        player->OnRotate((int)asp * (deltaTime / 1000.f));
    }
    if (IM->IsKeyDown(SDLK_x))
    {
        ent->animation->SetAnimation(0);
    }
    else if (IM->IsKeyDown(SDLK_c))
    {
        ent->animation->StopAnimation();
    }

    ent->animation->OnUpdate();
}

鼠标/十字准线处理在这里并不重要,即使没有它滞后

1 个答案:

答案 0 :(得分:4)

你的问题在这里:

if (SDL_PollEvent(&event_)) // <--- Change if to while
{
    if (event_.type == SDL_QUIT)
    {
        running = false;
    }
    else if (event_.type == SDL_MOUSEMOTION)
    {
        CCrosshair::Instance()->OnUpdate();
    }
}

if中运行此功能意味着您只会从每帧的事件队列中取出一个事件。即使您只是稍微移动鼠标,SDL也会向鼠标事件发送垃圾邮件。而且由于每帧只从队列中取一个事件,队列中的鼠标事件数量将不断增加,并且keydown / up事件将在队列中“丢失”。远远超过鼠标事件。

您可以查看SDL2 wiki了解详情。