Init.cpp
上传用户:cxh8989
上传日期:2021-01-22
资源大小:2544k
文件大小:6k
源码类别:

射击游戏

开发平台:

Visual C++

  1. #include "main.h"
  2. #include "quake3bsp.h"
  3. /** 创建纹理 */
  4. bool CreateTexture(UINT &texture, LPSTR strFileName)
  5. {
  6. if(!strFileName) 
  7. return false;
  8. tImage *pImage = NULL;
  9. if(strstr(strFileName, ".jpg"))
  10. {
  11. pImage = LoadJPG(strFileName);
  12. }
  13. else if(strstr(strFileName, ".tga"))
  14. {
  15. pImage = LoadTGA(strFileName);
  16. }
  17. else if(strstr(strFileName, ".bmp"))
  18. {
  19. pImage = LoadBMP(strFileName);
  20. }
  21. else
  22. return false;
  23. if(pImage == NULL)
  24. return false;
  25. glGenTextures(1, &texture);
  26. glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
  27. glBindTexture(GL_TEXTURE_2D, texture);
  28. int textureType = GL_RGB;
  29. if(pImage->channels == 4)
  30. textureType = GL_RGBA;
  31. gluBuild2DMipmaps(GL_TEXTURE_2D, pImage->channels, pImage->sizeX, 
  32.   pImage->sizeY, textureType, GL_UNSIGNED_BYTE, pImage->data);
  33. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
  34. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  35. if (pImage)
  36. {
  37. if (pImage->data)
  38. {
  39. free(pImage->data);
  40. }
  41. free(pImage);
  42. }
  43. return true;
  44. }
  45. void ChangeToFullScreen()
  46. {
  47. DEVMODE dmSettings = {0};
  48. memset(&dmSettings,0,sizeof(dmSettings));
  49. if(!EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dmSettings))
  50. {
  51. MessageBox(NULL, "Could Not Enum Display Settings", "Error", MB_OK);
  52. return;
  53. }
  54. dmSettings.dmPelsWidth = SCREEN_WIDTH;
  55. dmSettings.dmPelsHeight = SCREEN_HEIGHT;
  56. dmSettings.dmFields     = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
  57. int result = ChangeDisplaySettings(&dmSettings,CDS_FULLSCREEN);
  58. if(result != DISP_CHANGE_SUCCESSFUL)
  59. {
  60. MessageBox(NULL, "Display Mode Not Compatible", "Error", MB_OK);
  61. PostQuitMessage(0);
  62. }
  63. }
  64. /** 创建窗口 */
  65. HWND CreateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, bool bFullScreen, HINSTANCE hInstance)
  66. {
  67. HWND hWnd;
  68. WNDCLASS wndclass;
  69. memset(&wndclass, 0, sizeof(WNDCLASS));
  70. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  71. wndclass.lpfnWndProc = WinProc;
  72. wndclass.hInstance = hInstance;
  73. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  74. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  75. wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
  76. wndclass.lpszClassName = "QuakeBsp";
  77. RegisterClass(&wndclass);
  78. if(bFullScreen && !dwStyle) 
  79. {
  80. dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  81. ChangeToFullScreen();
  82. ShowCursor(FALSE);
  83. }
  84. else if(!dwStyle)
  85. dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  86. g_hInstance = hInstance;
  87. RECT rWindow;
  88. rWindow.left = 0;
  89. rWindow.right = width;
  90. rWindow.top     = 0;
  91. rWindow.bottom = height;
  92. AdjustWindowRect( &rWindow, dwStyle, false);
  93. hWnd = CreateWindow("QuakeBsp", strWindowName, dwStyle, 0, 0,
  94. rWindow.right  - rWindow.left, rWindow.bottom - rWindow.top, 
  95. NULL, NULL, hInstance, NULL);
  96. if(!hWnd) return NULL;
  97. ShowWindow(hWnd, SW_SHOWNORMAL);
  98. UpdateWindow(hWnd);
  99. SetFocus(hWnd);
  100. return hWnd;
  101. }
  102. /** 设置像素格式 */
  103. bool bSetupPixelFormat(HDC hdc) 
  104.     PIXELFORMATDESCRIPTOR pfd = {0}; 
  105.     int pixelformat; 
  106.  
  107.     pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  108.     pfd.nVersion = 1;
  109.     pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; 
  110.     pfd.dwLayerMask = PFD_MAIN_PLANE;
  111.     pfd.iPixelType = PFD_TYPE_RGBA;
  112.     pfd.cColorBits = SCREEN_DEPTH;
  113.     pfd.cDepthBits = SCREEN_DEPTH;
  114.     pfd.cAccumBits = 0;
  115.     pfd.cStencilBits = 0;
  116.  
  117.     if ( (pixelformat = ChoosePixelFormat(hdc, &pfd)) == FALSE ) 
  118.     { 
  119.         MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); 
  120.         return FALSE; 
  121.     } 
  122.  
  123.     if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE) 
  124.     { 
  125.         MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); 
  126.         return FALSE; 
  127.     } 
  128.  
  129.     return TRUE;
  130. }
  131. void SizeOpenGLScreen(int width, int height)
  132. {
  133. if (height==0)
  134. {
  135. height=1;
  136. }
  137. glViewport(0,0,width,height);
  138. glMatrixMode(GL_PROJECTION);
  139. glLoadIdentity();
  140. gluPerspective(70.0f,(GLfloat)width/(GLfloat)height, 10.0f , 4000.0f);
  141. glMatrixMode(GL_MODELVIEW);
  142. glLoadIdentity();
  143. }
  144. /** 初始化OpenGL */
  145. void InitializeOpenGL(int width, int height) 
  146. {  
  147.     g_hDC = GetDC(g_hWnd);
  148.     if (!bSetupPixelFormat(g_hDC))
  149.         PostQuitMessage (0);
  150.     g_hRC = wglCreateContext(g_hDC);
  151.     wglMakeCurrent(g_hDC, g_hRC);
  152. SizeOpenGLScreen(width, height);
  153. }
  154. void DeInit()
  155. {
  156. if (g_hRC)
  157. {
  158. wglMakeCurrent(NULL, NULL);
  159. wglDeleteContext(g_hRC);
  160. }
  161. if (g_hDC) 
  162. ReleaseDC(g_hWnd, g_hDC);
  163. if(g_bFullScreen)
  164. {
  165. ChangeDisplaySettings(NULL,0);
  166. ShowCursor(TRUE);
  167. }
  168. UnregisterClass("QuakeBsp", g_hInstance);
  169. PostQuitMessage (0);
  170. }
  171. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprev, PSTR cmdline, int ishow)
  172. {
  173. HWND hWnd;
  174. if(MessageBox(NULL, "是否全屏运行?", "选择模式", MB_YESNO | MB_ICONQUESTION) == IDNO)
  175. g_bFullScreen = false;
  176. /** 创建窗口 */
  177. hWnd = CreateMyWindow("QuakeBsp", SCREEN_WIDTH, SCREEN_HEIGHT, 0, g_bFullScreen, hInstance);
  178. if(hWnd == NULL) return TRUE;
  179. Init(hWnd);
  180. return MainLoop();
  181. }