我需要关于使用SDL处理键盘事件的建议。
我有一个第一人称摄像机,可以前进、后退、左右平移,并且可以使用鼠标来观察周围的环境,这非常棒。以下是我的processEvents函数:
现在虽然这个功能可以工作,但它有一些限制。最大的限制,也是我提问的目的,是它似乎只能处理最近按下的按键。所以,如果我按住“s”向后走,然后按下“d”向右平移,我最终只会向右平移,而不会向后走。
有人可以指点我如何更好地处理SDL键盘输入,支持同时按下多个按键等吗?
我有一个第一人称摄像机,可以前进、后退、左右平移,并且可以使用鼠标来观察周围的环境,这非常棒。以下是我的processEvents函数:
void processEvents()
{
int mid_x = screen_width >> 1;
int mid_y = screen_height >> 1;
int mpx = event.motion.x;
int mpy = event.motion.y;
float angle_y = 0.0f;
float angle_z = 0.0f;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
quit = true;
break;
case SDLK_w:
objCamera.Move_Camera( CAMERASPEED);
break;
case SDLK_s:
objCamera.Move_Camera(-CAMERASPEED);
break;
case SDLK_d:
objCamera.Strafe_Camera( CAMERASPEED);
break;
case SDLK_a:
objCamera.Strafe_Camera(-CAMERASPEED);
break;
default:
break;
}
break;
case SDL_MOUSEMOTION:
if( (mpx == mid_x) && (mpy == mid_y) ) return;
SDL_WarpMouse(mid_x, mid_y);
// Get the direction from the mouse cursor, set a resonable maneuvering speed
angle_y = (float)( (mid_x - mpx) ) / 1000;
angle_z = (float)( (mid_y - mpy) ) / 1000;
// The higher the value is the faster the camera looks around.
objCamera.mView.y += angle_z * 2;
// limit the rotation around the x-axis
if((objCamera.mView.y - objCamera.mPos.y) > 8) objCamera.mView.y = objCamera.mPos.y + 8;
if((objCamera.mView.y - objCamera.mPos.y) <-8) objCamera.mView.y = objCamera.mPos.y - 8;
objCamera.Rotate_View(-angle_y);
break;
case SDL_QUIT:
quit = true;
break;
case SDL_VIDEORESIZE:
screen = SDL_SetVideoMode( event.resize.w, event.resize.h, screen_bpp, SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE );
screen_width = event.resize.w;
screen_height = event.resize.h;
init_opengl();
std::cout << "Resized to width: " << event.resize.w << " height: " << event.resize.h << std::endl;
break;
default:
break;
}
}
}
现在虽然这个功能可以工作,但它有一些限制。最大的限制,也是我提问的目的,是它似乎只能处理最近按下的按键。所以,如果我按住“s”向后走,然后按下“d”向右平移,我最终只会向右平移,而不会向后走。
有人可以指点我如何更好地处理SDL键盘输入,支持同时按下多个按键等吗?