⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdlhandler.cpp

📁 S.C.O.U.R.G.E.是一款类似Rogue的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  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 + -