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不管我说什么。我不完全确定你的输入管理器是如何运作的。但显然,您需要更改事件循环中发生的事情,以便它可以在每帧运行几次,而不会影响性能。任何需要在每一帧运行的函数都必须放在事件循环之后。输入管理器(现在)只是一个布尔表,如果按键与否,它会不断更新。