Events SDL2.0-鼠标移动是垃圾邮件事件队列

Events SDL2.0-鼠标移动是垃圾邮件事件队列,events,queue,mouse,sdl,sdl-2,Events,Queue,Mouse,Sdl,Sdl 2,正如蒂特尔所说,鼠标的移动会导致事件队列中的垃圾,所以当我摇晃鼠标时,我就不能行走。有办法吗?仅用于鼠标或其他对象的不同队列 SDL_Event event_; CInputManager::Instance()->SetEvent(&event_); InitializeGameFiles(); while (running) { if (SDL_PollEvent(&event_)) {

正如蒂特尔所说,鼠标的移动会导致事件队列中的垃圾,所以当我摇晃鼠标时,我就不能行走。有办法吗?仅用于鼠标或其他对象的不同队列

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();
}
鼠标/十字线处理在这里并不真正相关,即使没有它,它也会滞后

您的问题就在这里:

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_PollEvent(&event))/OnUpdate();
}
}
if
中运行此命令意味着每帧仅从事件队列中删除一个事件。SDL倾向于垃圾邮件鼠标事件,即使你只是移动鼠标一点点。而且,由于每帧只从队列中获取一个事件,因此队列中的鼠标事件数量将不断增加,而按键向下/向上事件将在队列中“丢失”。鼠标事件的数量远远超过鼠标事件

有关详细信息,您可以查看。

您的问题在这里:

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_PollEvent(&event))/OnUpdate();
}
}
if
中运行此命令意味着每帧仅从事件队列中删除一个事件。SDL倾向于垃圾邮件鼠标事件,即使你只是移动鼠标一点点。而且,由于每帧只从队列中获取一个事件,因此队列中的鼠标事件数量将不断增加,而按键向下/向上事件将在队列中“丢失”。鼠标事件的数量远远超过鼠标事件


您可以查看以了解更多信息。

向我们展示您如何处理事件,除非您发布一些代码,否则我们无法帮助您。添加的代码用于主帖子。向我们展示您如何处理事件,除非您发布一些代码,否则我们无法帮助您。添加的代码用于主帖子。如果我这样做,则只有当队列为空时,游戏才会更新。当我将OnUpdate()/OnRender()添加到循环中时,当队列中没有任何内容时,游戏将冻结。@PatrykSeregiet循环所有事件不会花费很多时间。我的建议是您更改输入管理器,以便它跟踪所有键、鼠标位置等。。。输入管理器本身可以运行事件循环,这使得一切都更快、更简单easier@PatrykSeregiet不管我说什么。我不完全确定你的输入管理器是如何运作的。但显然,您需要更改事件循环中发生的事情,以便它可以在每帧运行几次,而不会影响性能。任何需要在每帧运行的函数都必须放在事件循环之后。输入管理器(现在)只是一个布尔表,如果按下或不按下该键,它会不断更新。如果我这样做,那么游戏只会在队列为空时更新。当我将OnUpdate()/OnRender()添加到循环中时,当队列中没有任何内容时,游戏将冻结。@PatrykSeregiet循环所有事件不会花费很多时间。我的建议是您更改输入管理器,以便它跟踪所有键、鼠标位置等。。。输入管理器本身可以运行事件循环,这使得一切都更快、更简单easier@PatrykSeregiet不管我说什么。我不完全确定你的输入管理器是如何运作的。但显然,您需要更改事件循环中发生的事情,以便它可以在每帧运行几次,而不会影响性能。任何需要在每一帧运行的函数都必须放在事件循环之后。输入管理器(现在)只是一个布尔表,如果按键与否,它会不断更新。