void MainLoop(void) { bool done = false; // is our job done ? not yet ! SDL_Event event; while(! done) // as long as our job's not done { while( SDL_PollEvent(& event) ) // look for events (like keystrokes, resizing etc.) { switch ( event.type ) // what kind of event have we got ? { case SDL_QUIT : // if user wishes to quit done = true; // this implies our job is done break; case SDL_KEYDOWN : // if the user has pressed a key HandleKeyPressEvent( & event. key.keysym ); // callback for handling keystrokes, arg is key pressed break; case SDL_KEYUP : HandleKeyReleaseEvent(& event.key.keysym) ; // callback for handling keystrokes, arg is key released break; case SDL_VIDEORESIZE : // if there is a resize event // request SDL to resize the window to the size and depth etc. that we specify MainWindow = SDL_SetVideoMode( event.resize.w, event.resize.h, SCREEN_DEPTH, VideoFlags ); SizeOpenGLScreen(event.resize.w, event.resize.h); // now resize the OpenGL viewport if(MainWindow == NULL) // if window resize has failed { cerr << " Failed resizing SDL window : " << SDL_GetError() << endl; // report error Quit(0); } break; default: // any other event break; // nothing to do } // switch } // while( SDL_ ... //////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** //////////////////// // Here we check for mouse and key movements every frame g_Camera.SetViewByMouse(); // Move the camera by the mouse CheckForMovement(); // Check if we pressed a key RenderScene(); // Update the screen //////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** //////////////////// } // while( ! done) }
Event GUIWindow::GetNextEvent() { // Setup a temporary event and get the next X11 event Event event; XNextEvent(display, &xEvent); // See what type of event we have switch(xEvent.type) { case Expose: HandleExposeEvent(event); break; case KeyPress: HandleKeyPressEvent(event); break; case KeyRelease: HandleKeyReleaseEvent(event); break; case ButtonPress: HandleButtonPressEvent(event); break; case ButtonRelease: HandleButtonReleaseEvent(event); break; case MotionNotify: HandleMotionNotifyEvent(event); break; case ClientMessage: HandleClientMessageEvent(event); break; case ConfigureNotify: { XConfigureEvent xce = xEvent.xconfigure; // Test for resize event if(xce.width != width || xce.height != height) { width = xce.width; height = xce.height; event.eventType = evResize; event.mouseX = width; event.mouseY = height; } } break; default: HandleIgnoreEvent(event); break; } return event; }
/** Game event loop. */ void EventLoop() { struct timeval last, current; unsigned long elapsedTime; int repeat; XEvent event; SetFirstLevel(); XSelectInput(display, mainWindow, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ExposureMask); shouldExit = 0; DoStartDelay(); gettimeofday(&last, NULL); while(!shouldExit) { if(didWin) { WinLoop(); NextLevel(); moveRight = 0; moveLeft = 0; gettimeofday(&last, NULL); } if(didLose) { Redraw(); DoStartDelay(); break; } while(XPending(display) > 0) { XNextEvent(display, &event); switch(event.type) { case Expose: HandleExposeEvent(&event.xexpose); break; case KeyPress: HandleKeyPressEvent(&event.xkey); break; case KeyRelease: HandleKeyReleaseEvent(&event.xkey); break; case ButtonPress: HandleButtonPressEvent(); break; default: break; } } if(isPaused) { gettimeofday(&last, NULL); continue; } gettimeofday(¤t, NULL); elapsedTime = (current.tv_sec - last.tv_sec) * 1000000; elapsedTime += current.tv_usec - last.tv_usec; if(elapsedTime >= SPEED) { last = current; EraseBall(); repeat = (int)(((float)elapsedTime / SPEED) + 0.5); do { if(moveRight && !moveLeft) { MoveBallRight(); } else if(moveLeft && !moveRight) { MoveBallLeft(); } MoveBall(); --repeat; } while(repeat); DrawBall(); Redraw(); if(didDie) { didDie = 0; DoStartDelay(); gettimeofday(&last, NULL); } } } }