GameApp.h
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:7k
源码类别:

其他游戏

开发平台:

Python

  1. /*
  2. s_p_oneil@hotmail.com
  3. Copyright (c) 2000, Sean O'Neil
  4. All rights reserved.
  5. Redistribution and use in source and binary forms, with or without
  6. modification, are permitted provided that the following conditions are met:
  7. * Redistributions of source code must retain the above copyright notice,
  8.   this list of conditions and the following disclaimer.
  9. * Redistributions in binary form must reproduce the above copyright notice,
  10.   this list of conditions and the following disclaimer in the documentation
  11.   and/or other materials provided with the distribution.
  12. * Neither the name of this project nor the names of its contributors
  13.   may be used to endorse or promote products derived from this software
  14.   without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  19. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  20. CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  21. SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  22. INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  23. CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  25. POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef __GameApp_h__
  28. #define __GameApp_h__
  29. #include "GameEngine.h"
  30. /*******************************************************************************
  31. * Class: CDisplayMode
  32. ********************************************************************************
  33. * This class just makes it easier for the main part of the program to handle
  34. * display modes. Windowed mode is also treated as a display mode.
  35. // Build list of valid display modes
  36. DEVMODE dm;
  37. CDisplayModeList llModes;
  38. for(int i=0; EnumDisplaySettings(NULL, i, &dm); i++)
  39. {
  40. if(dm.dmBitsPerPel >= 16 && dm.dmPelsHeight >= 480)
  41. {
  42. CDisplayMode *pMode = new CDisplayMode(dm);
  43. TRACE("%s Mode: %dx%d, %d BPP, %d Hz", pMode->IsFullScreen() ? "Fullscreen" : "Windowed", pMode->GetWidth(), pMode->GetHeight(), pMode->GetBitsPerPixel(), pMode->GetFrequency());
  44. llModes.AddTail(pMode);
  45. }
  46. }
  47. *******************************************************************************/
  48. #define CDisplayModeList CLinkedList<CDisplayMode>
  49. class CDisplayMode : public CListNode<CDisplayMode>
  50. {
  51. protected:
  52. bool m_bFullScreen;
  53. int m_nWidth;
  54. int m_nHeight;
  55. int m_nBitsPerPixel;
  56. int m_nFrequency;
  57. public:
  58. CDisplayMode() {}
  59. CDisplayMode(bool bFullScreen, int nWidth, int nHeight, int nBitsPerPixel=0, int nFrequency=0)
  60. {
  61. m_bFullScreen = bFullScreen;
  62. m_nWidth = nWidth;
  63. m_nHeight = nHeight;
  64. m_nBitsPerPixel = nBitsPerPixel;
  65. m_nFrequency = nFrequency;
  66. }
  67. CDisplayMode(CDisplayMode &dm) { *this = dm; }
  68. CDisplayMode(DEVMODE &dm) { *this = dm; }
  69. bool operator==(CDisplayMode &dm) { return (m_bFullScreen == dm.m_bFullScreen && m_nWidth == dm.m_nWidth && m_nHeight == dm.m_nHeight && m_nBitsPerPixel == dm.m_nBitsPerPixel && m_nFrequency == dm.m_nFrequency); }
  70. bool operator==(DEVMODE &dm) { return (m_bFullScreen == true && m_nWidth == (int)dm.dmPelsWidth && m_nHeight == (int)dm.dmPelsHeight && m_nBitsPerPixel == (int)dm.dmBitsPerPel && m_nFrequency == (int)dm.dmDisplayFrequency); }
  71. void operator=(CDisplayMode &dm)
  72. {
  73. m_bFullScreen = dm.m_bFullScreen;
  74. m_nWidth = dm.m_nWidth;
  75. m_nHeight = dm.m_nHeight;
  76. m_nBitsPerPixel = dm.m_nBitsPerPixel;
  77. m_nFrequency = dm.m_nFrequency;
  78. }
  79. void operator=(DEVMODE &dm)
  80. {
  81. m_bFullScreen = true;
  82. m_nWidth = dm.dmPelsWidth;
  83. m_nHeight = dm.dmPelsHeight;
  84. m_nBitsPerPixel = dm.dmBitsPerPel;
  85. m_nFrequency = dm.dmDisplayFrequency;
  86. }
  87. bool operator<(CDisplayMode &dm)
  88. {
  89. return // Reorder the statements below to change how display modes are sorted
  90. (m_nWidth < dm.m_nWidth || // Then sort by width
  91. (m_nWidth == dm.m_nWidth &&
  92. (m_nHeight < dm.m_nHeight || // Then sort by height
  93. (m_nHeight == dm.m_nHeight &&
  94. (m_nBitsPerPixel < dm.m_nBitsPerPixel || // Then sort by bits per pixel
  95. (m_nBitsPerPixel == dm.m_nBitsPerPixel && 
  96. (m_nFrequency < dm.m_nFrequency //|| // Then sort by frequency
  97. //(m_nFrequency == dm.m_nFrequency &&
  98. )))))));
  99. }
  100. void LoadDisplaySettings();
  101. void SaveDisplaySettings();
  102. bool IsFullScreen() { return m_bFullScreen; }
  103. int GetWidth() { return m_nWidth; }
  104. int GetHeight() { return m_nHeight; }
  105. int GetBitsPerPixel() { return m_nBitsPerPixel; }
  106. int GetFrequency() { return m_nFrequency; }
  107. void SetFullScreen(bool b)
  108. {
  109. m_bFullScreen = b;
  110. if(!m_bFullScreen)
  111. m_nBitsPerPixel = m_nFrequency = 0;
  112. }
  113. void SetWidth(int n) { m_nWidth = n; }
  114. void SetHeight(int n) { m_nHeight = n; }
  115. void SetBitsPerPixel(int n) { if(m_bFullScreen) m_nBitsPerPixel = n; }
  116. void SetFrequency(int n) { if(m_bFullScreen) m_nFrequency = n; }
  117. LONG SetDisplayMode()
  118. {
  119. DEVMODE dm;
  120. dm.dmSize = sizeof(DEVMODE);
  121. dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
  122. dm.dmPelsWidth = m_nWidth;
  123. dm.dmPelsHeight = m_nHeight;
  124. dm.dmBitsPerPel = m_nBitsPerPixel;
  125. if(m_nFrequency)
  126. {
  127. dm.dmFields |= DM_DISPLAYFREQUENCY;
  128. dm.dmDisplayFrequency = m_nFrequency;
  129. }
  130. //return ChangeDisplaySettingsEx(NULL, &dm, NULL, CDS_FULLSCREEN, NULL);
  131. return ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
  132. }
  133. static LONG ResetDisplayMode()
  134. {
  135. //return ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
  136. return ChangeDisplaySettings(NULL, CDS_FULLSCREEN);
  137. }
  138. };
  139. /*******************************************************************************
  140. * Class: CGameApp
  141. ********************************************************************************
  142. * This class is similar to MFC's CWinApp, providing a lot of the same functions
  143. * without the extra baggage of MFC. This instance handles all the Windows-specific
  144. * OpenGL initialization/cleanup code. It also creates an instance of CGameEngine
  145. * and calls its RenderFrame() function in OnIdle().
  146. *******************************************************************************/
  147. class CGameApp : public CWinApp, public CDisplayMode
  148. {
  149. // Attributes
  150. protected:
  151. HDC m_hDC;
  152. HGLRC m_hGLRC;
  153. bool m_bActive;
  154. int m_nTimer;
  155. CGameEngine *m_pGameEngine;
  156. // Operations
  157. protected:
  158. static LRESULT CALLBACK WindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  159. int OnCreate(HWND hWnd);
  160. void OnDestroy();
  161. void OnSize(int nType, int nWidth, int nHeight);
  162. bool OnCommand(WPARAM wParam, LPARAM lParam);
  163. public:
  164. CGameApp(HINSTANCE hInstance, HINSTANCE hPrevInstance=NULL, char *pszCmdLine="", int nShowCmd=SW_SHOWNORMAL)
  165. : CWinApp(hInstance, hPrevInstance, pszCmdLine, nShowCmd)
  166. {
  167. m_hDC = NULL;
  168. m_hGLRC = NULL;
  169. m_bActive = false;
  170. m_pGameEngine = NULL;
  171. }
  172. virtual bool InitInstance();
  173. virtual int ExitInstance();
  174. virtual bool OnIdle();
  175. virtual void Pause();
  176. virtual void Restore();
  177. virtual bool InitMode(bool bFullScreen, int nWidth, int nHeight, int nBitsPerPixel=0, int nFrequency=0);
  178. bool IsActive() { return m_bActive; }
  179. void MakeCurrent() { wglMakeCurrent(m_hDC, m_hGLRC); }
  180. HDC GetHDC() { return m_hDC; }
  181. };
  182. inline CGameApp *GameApp() { return (CGameApp *)GetApp(); }
  183. #endif // __GameApp_h__