mi sono familiarizzato con la programmazione OpenGL usando SDL su Ubuntu usando C++. Dopo essermi guardato intorno e sperimentato, sto iniziando a capire. Ho bisogno di consigli sulla gestione degli eventi da tastiera con SDL.Come gestire più pressioni di tasti contemporaneamente con SDL?
Ho una macchina fotografica in prima persona, e posso camminare in avanti, indietro, sfilare a destra e sinistra e usare il mouse per guardarmi intorno che è fantastico. Qui è la mia funzione 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;
}
}
}
Ora, mentre questo è in funzione, ha alcune limitazioni. Il più grande e lo scopo della mia domanda è che sembra elaborare solo l'ultima chiave che è stata premuta. Quindi se sto trattenendo 's' per camminare all'indietro e premo 'd' per muovere a destra, finisco per mitragliare a destra ma non andare indietro.
Qualcuno può indicarmi la giusta direzione per una migliore gestione della tastiera con SDL, supporto per più pressioni di tasti contemporaneamente, ecc.?
Grazie
Davvero una bella soluzione, questo può essere utilizzato in quasi tutti i giochi – devsaw