📄 sdlhandler.cpp
字号:
cout << "Setting video mode: " << uc->getW() << "x" << uc->getH() << "x" << uc->getBpp() << endl; /* get a SDL surface */ screen = SDL_SetVideoMode( uc->getW(), uc->getH(), uc->getBpp(), videoFlags ); /* Verify there is a surface */ if ( !screen ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); quit( 1 ); } /* hide the mouse cursor; we have our own */ SDL_ShowCursor(SDL_DISABLE); SDL_WM_SetCaption("Scourge", NULL); /* for Mac OS X in windowed mode, invert the mouse. SDL bug. */#ifdef __APPLE__ if(!uc->getFullscreen()) invertMouse = true;#endif /* initialize OpenGL */ initGL( ); /* resize the initial window */ resizeWindow( screen->w, screen->h );}void SDLHandler::fireEvent(Widget *widget, SDL_Event *event) { storedWidget = widget; storedEvent = event;}bool SDLHandler::firedEventWaiting() { return storedEvent != NULL;}void SDLHandler::mainLoop() { /* whether or not the window is active */ int isActive = TRUE; SDL_Event event; int mx, my; while(true) { int eventCount = 0; while(SDL_PollEvent(&event) && (eventCount++) < 10) { mouseEvent = mouseButton = 0; Widget *widget = NULL; switch( event.type ) { case SDL_MOUSEMOTION: if(invertMouse) event.motion.y = screen->h - event.motion.y; // applyMouseOffset(event.button.x, event.button.y, &mx, &my); mouseX = event.motion.x; mouseY = event.motion.y; mouseButton = event.button.button; mouseEvent = SDL_MOUSEMOTION; widget = Window::delegateEvent( &event, event.button.x, event.button.y ); break; case SDL_MOUSEBUTTONUP: if(invertMouse) event.button.y = screen->h - event.button.y; applyMouseOffset(event.button.x, event.button.y, &mx, &my); mouseEvent = SDL_MOUSEBUTTONUP; mouseButton = event.button.button; mouseDragging = false; widget = Window::delegateEvent( &event, mx, my ); break; case SDL_MOUSEBUTTONDOWN: if(invertMouse) event.button.y = screen->h - event.button.y; applyMouseOffset(event.button.x, event.button.y, &mx, &my); mouseEvent = SDL_MOUSEBUTTONDOWN; mouseButton = event.button.button; mouseDragging = true; widget = Window::delegateEvent( &event, mx, my ); break; case SDL_ACTIVEEVENT: /* Something's happend with our focus * If we lost focus or we are iconified, we * shouldn't draw the screen */ if ( event.active.gain == 0 ) isActive = FALSE; else isActive = TRUE; break; case SDL_VIDEORESIZE: /* handle resize event */ screen = SDL_SetVideoMode( event.resize.w, event.resize.h, 16, videoFlags ); if ( !screen ) { fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) ); quit( 1 ); } resizeWindow( event.resize.w, event.resize.h ); break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_F1: SDL_WM_ToggleFullScreen(screen); break; default: break; } break; case SDL_QUIT: /* handle quit requests */ quit(0); break; default: break; } bool res = false; if(widget) { res = eventHandler->handleEvent(widget, &event); // this is so that moving the cursor over a // window doesn't scroll the map forever if( event.type == SDL_MOUSEMOTION ) res = eventHandler->handleEvent(&event); } else { res = eventHandler->handleEvent(&event); } if(res) { if(popHandlers()) return; } } if(isActive) { screenView->drawView(); // redraw the gui Window::drawVisibleWindows(); screenView->drawAfter(); if(shapePal->cursorImage) { // for cursor: do alpha bit testing glDisable(GL_TEXTURE_2D); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glDisable(GL_DEPTH_TEST); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_NOTEQUAL, 0); glLoadIdentity( ); glPixelZoom( 1.0, -1.0 ); glRasterPos2f( (float)mouseX, (float)mouseY ); if(cursorMode == CURSOR_NORMAL) { glDrawPixels(shapePal->cursor->w, shapePal->cursor->h, GL_BGRA, GL_UNSIGNED_BYTE, shapePal->cursorImage); } else if(cursorMode == CURSOR_CROSSHAIR) { glDrawPixels(shapePal->crosshair->w, shapePal->crosshair->h, GL_BGRA, GL_UNSIGNED_BYTE, shapePal->crosshairImage); } //glDrawPixels(shapePal->cursor->w, shapePal->cursor->h, // GL_BGR, GL_UNSIGNED_BYTE, shapePal->cursor->pixels); glDisable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); } } #ifdef SHOW_DEBUG_INFO glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glColor4f( 0.8f, 0.7f, 0.2f, 1.0f ); texPrint(700, 10, "FPS: %g", getFPS()); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D);#endif /* Draw it to the screen */ SDL_GL_SwapBuffers( ); /* Gather our frames per second */ Frames++; { GLint t = SDL_GetTicks(); if (t - T0 >= 5000) { GLfloat seconds = (t - T0) / 1000.0; fps = Frames / seconds; //printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps); T0 = t; Frames = 0; } } }}void SDLHandler::texPrint(GLfloat x, GLfloat y, const char *fmt, ...) { if(!text) text = new TexturedText(); char str[256]; // Holds our string va_list ap; // Pointer to our list of elements // If there's no text, do nothing if ( fmt == NULL ) return; // Parses The String For Variables va_start( ap, fmt ); // Converts Symbols To Actual Numbers vsprintf( str, fmt, ap ); va_end( ap ); if(!our_font_initialized) { char s[200]; sprintf(s, "%s/Vera.ttf", rootDir); our_font.init(s, 8); our_font_initialized = true; } freetype_print(our_font, x, y, str);}bool SDLHandler::sectionIntersects(int a1, int a2, int b1, int b2) { return(((a1 <= b1 && a2 > b1) || (a1 >= b1 && a1 < b2)) ? true : false);}bool SDLHandler::intersects(SDL_Rect *a, SDL_Rect *b) { return((sectionIntersects(a->x, a->x + a->w, b->x, b->x + b->w) && sectionIntersects(a->y, a->y + a->h, b->y, b->y + b->h)) ? true : false);}void SDLHandler::testDrawView() { /* Clear The Screen And The Depth Buffer */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* Move Right 3 Units */ glLoadIdentity( ); glTranslatef( 1.5f, 0.0f, -6.0f ); /* Rotate The Quad On The X axis ( NEW ) */ glRotatef( rquad, 1.0f, 0.0f, 0.0f ); /* Set The Color To Blue One Time Only */ glColor3f( 0.5f, 0.5f, 1.0f); glBegin( GL_QUADS ); /* Draw A Quad */ glColor3f( 0.0f, 1.0f, 0.0f ); /* Set The Color To Green */ glVertex3f( 1.0f, 1.0f, -1.0f ); /* Top Right Of The Quad (Top) */ glVertex3f( -1.0f, 1.0f, -1.0f ); /* Top Left Of The Quad (Top) */ glVertex3f( -1.0f, 1.0f, 1.0f ); /* Bottom Left Of The Quad (Top) */ glVertex3f( 1.0f, 1.0f, 1.0f ); /* Bottom Right Of The Quad (Top) */ glColor3f( 1.0f, 0.5f, 0.0f ); /* Set The Color To Orange */ glVertex3f( 1.0f, -1.0f, 1.0f ); /* Top Right Of The Quad (Botm) */ glVertex3f( -1.0f, -1.0f, 1.0f ); /* Top Left Of The Quad (Botm) */ glVertex3f( -1.0f, -1.0f, -1.0f ); /* Bottom Left Of The Quad (Botm) */ glVertex3f( 1.0f, -1.0f, -1.0f ); /* Bottom Right Of The Quad (Botm) */ glColor3f( 1.0f, 0.0f, 0.0f ); /* Set The Color To Red */ glVertex3f( 1.0f, 1.0f, 1.0f ); /* Top Right Of The Quad (Front) */ glVertex3f( -1.0f, 1.0f, 1.0f ); /* Top Left Of The Quad (Front) */ glVertex3f( -1.0f, -1.0f, 1.0f ); /* Bottom Left Of The Quad (Front) */ glVertex3f( 1.0f, -1.0f, 1.0f ); /* Bottom Right Of The Quad (Front) */ glColor3f( 1.0f, 1.0f, 0.0f ); /* Set The Color To Yellow */ glVertex3f( 1.0f, -1.0f, -1.0f ); /* Bottom Left Of The Quad (Back) */ glVertex3f( -1.0f, -1.0f, -1.0f ); /* Bottom Right Of The Quad (Back) */ glVertex3f( -1.0f, 1.0f, -1.0f ); /* Top Right Of The Quad (Back) */ glVertex3f( 1.0f, 1.0f, -1.0f ); /* Top Left Of The Quad (Back) */ glColor3f( 0.0f, 0.0f, 1.0f ); /* Set The Color To Blue */ glVertex3f( -1.0f, 1.0f, 1.0f ); /* Top Right Of The Quad (Left) */ glVertex3f( -1.0f, 1.0f, -1.0f ); /* Top Left Of The Quad (Left) */ glVertex3f( -1.0f, -1.0f, -1.0f ); /* Bottom Left Of The Quad (Left) */ glVertex3f( -1.0f, -1.0f, 1.0f ); /* Bottom Right Of The Quad (Left) */ glColor3f( 1.0f, 0.0f, 1.0f ); /* Set The Color To Violet */ glVertex3f( 1.0f, 1.0f, -1.0f ); /* Top Right Of The Quad (Right) */ glVertex3f( 1.0f, 1.0f, 1.0f ); /* Top Left Of The Quad (Right) */ glVertex3f( 1.0f, -1.0f, 1.0f ); /* Bottom Left Of The Quad (Right) */ glVertex3f( 1.0f, -1.0f, -1.0f ); /* Bottom Right Of The Quad (Right) */ glEnd( ); /* Done Drawing The Quad */ /* Move Left 1.5 Units And Into The Screen 6.0 */ glLoadIdentity(); glTranslatef( 0.5f, 0.0f, -8.0f ); /* Rotate The Triangle On The Y axis ( NEW ) */ glRotatef( rtri, 0.0f, 1.0f, 0.0f ); glBegin( GL_TRIANGLES ); /* Drawing Using Triangles */ glColor3f( 1.0f, 0.0f, 0.0f ); /* Red */ glVertex3f( 0.0f, 1.0f, 0.0f ); /* Top Of Triangle (Front) */ glColor3f( 0.0f, 1.0f, 0.0f ); /* Green */ glVertex3f( -1.0f, -1.0f, 1.0f ); /* Left Of Triangle (Front) */ glColor3f( 0.0f, 0.0f, 1.0f ); /* Blue */ glVertex3f( 1.0f, -1.0f, 1.0f ); /* Right Of Triangle (Front) */ glColor3f( 1.0f, 0.0f, 0.0f ); /* Red */ glVertex3f( 0.0f, 1.0f, 0.0f ); /* Top Of Triangle (Right) */ glColor3f( 0.0f, 0.0f, 1.0f ); /* Blue */ glVertex3f( 1.0f, -1.0f, 1.0f ); /* Left Of Triangle (Right) */ glColor3f( 0.0f, 1.0f, 0.0f ); /* Green */ glVertex3f( 1.0f, -1.0f, -1.0f ); /* Right Of Triangle (Right) */ glColor3f( 1.0f, 0.0f, 0.0f ); /* Red */ glVertex3f( 0.0f, 1.0f, 0.0f ); /* Top Of Triangle (Back) */ glColor3f( 0.0f, 1.0f, 0.0f ); /* Green */ glVertex3f( 1.0f, -1.0f, -1.0f ); /* Left Of Triangle (Back) */ glColor3f( 0.0f, 0.0f, 1.0f ); /* Blue */ glVertex3f( -1.0f, -1.0f, -1.0f ); /* Right Of Triangle (Back) */ glColor3f( 1.0f, 0.0f, 0.0f ); /* Red */ glVertex3f( 0.0f, 1.0f, 0.0f ); /* Top Of Triangle (Left) */ glColor3f( 0.0f, 0.0f, 1.0f ); /* Blue */ glVertex3f( -1.0f, -1.0f, -1.0f ); /* Left Of Triangle (Left) */ glColor3f( 0.0f, 1.0f, 0.0f ); /* Green */ glVertex3f( -1.0f, -1.0f, 1.0f ); /* Right Of Triangle (Left) */ glEnd( ); /* Finished Drawing The Triangle */ /* Increase The Rotation Variable For The Triangle ( NEW ) */ rtri += 0.2f; /* Decrease The Rotation Variable For The Quad ( NEW ) */ rquad -=0.15f;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -