正如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();
}
鼠标/十字准线处理在这里并不重要,即使没有它滞后
答案 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了解详情。