GameEngine.cpp
上传用户:slhang369
上传日期:2022-04-19
资源大小:2452k
文件大小:8k
源码类别:

游戏引擎

开发平台:

Visual Basic

  1. //-----------------------------------------------------------------
  2. // Game Engine Object
  3. // C++ Source - GameEngine.cpp
  4. //-----------------------------------------------------------------
  5. //-----------------------------------------------------------------
  6. // Include Files
  7. //-----------------------------------------------------------------
  8. #include "GameEngine.h"
  9. //-----------------------------------------------------------------
  10. // Static Variable Initialization
  11. //-----------------------------------------------------------------
  12. GameEngine *GameEngine::m_pGameEngine = NULL;
  13. //-----------------------------------------------------------------
  14. // Windows Functions
  15. //-----------------------------------------------------------------
  16. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  17.   PSTR szCmdLine, int iCmdShow)
  18. {
  19.   MSG         msg;
  20.   static int  iTickTrigger = 0;
  21.   int         iTickCount;
  22.   if (GameInitialize(hInstance))
  23.   {
  24.     // Initialize the game engine
  25.     if (!GameEngine::GetEngine()->Initialize(iCmdShow))
  26.       return FALSE;
  27.     // Enter the main message loop
  28.     while (TRUE)
  29.     {
  30.       if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  31.       {
  32.         // Process the message
  33.         if (msg.message == WM_QUIT)
  34.           break;
  35.         TranslateMessage(&msg);
  36.         DispatchMessage(&msg);
  37.       }
  38.       else
  39.       {
  40.         // Make sure the game engine isn't sleeping
  41.         if (!GameEngine::GetEngine()->GetSleep())
  42.         {
  43.           // Check the tick count to see if a game cycle has elapsed
  44.           iTickCount = GetTickCount();
  45.           if (iTickCount > iTickTrigger)
  46.           {
  47.             iTickTrigger = iTickCount +
  48.               GameEngine::GetEngine()->GetFrameDelay();
  49.             HandleKeys();
  50.             GameCycle();
  51.           }
  52.         }
  53.       }
  54.     }
  55.     return (int)msg.wParam;
  56.   }
  57.   // End the game
  58.   GameEnd();
  59.   return TRUE;
  60. }
  61. LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
  62. {
  63.   // Route all Windows messages to the game engine
  64.   return GameEngine::GetEngine()->HandleEvent(hWindow, msg, wParam, lParam);
  65. }
  66. //-----------------------------------------------------------------
  67. // GameEngine Constructor(s)/Destructor
  68. //-----------------------------------------------------------------
  69. GameEngine::GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass,
  70.   LPTSTR szTitle, WORD wIcon, WORD wSmallIcon, int iWidth, int iHeight)
  71. {
  72.   // Set the member variables for the game engine
  73.   m_pGameEngine = this;
  74.   m_hInstance = hInstance;
  75.   m_hWindow = NULL;
  76.   if (lstrlen(szWindowClass) > 0)
  77.     lstrcpy(m_szWindowClass, szWindowClass);
  78.   if (lstrlen(szTitle) > 0)
  79.     lstrcpy(m_szTitle, szTitle);
  80.   m_wIcon = wIcon;
  81.   m_wSmallIcon = wSmallIcon;
  82.   m_iWidth = iWidth;
  83.   m_iHeight = iHeight;
  84.   m_iFrameDelay = 50;   // 20 FPS default
  85.   m_bSleep = TRUE;
  86.     m_uiMIDIPlayerID = 0;
  87. }
  88. GameEngine::~GameEngine()
  89. {
  90. }
  91. //-----------------------------------------------------------------
  92. // Game Engine General Methods
  93. //-----------------------------------------------------------------
  94. BOOL GameEngine::Initialize(int iCmdShow)
  95. {
  96.   WNDCLASSEX    wndclass;
  97.   // Create the window class for the main window
  98.   wndclass.cbSize         = sizeof(wndclass);
  99.   wndclass.style          = CS_HREDRAW | CS_VREDRAW;
  100.   wndclass.lpfnWndProc    = WndProc;
  101.   wndclass.cbClsExtra     = 0;
  102.   wndclass.cbWndExtra     = 0;
  103.   wndclass.hInstance      = m_hInstance;
  104.   wndclass.hIcon          = LoadIcon(m_hInstance,
  105.     MAKEINTRESOURCE(GetIcon()));
  106.   wndclass.hIconSm        = LoadIcon(m_hInstance,
  107.     MAKEINTRESOURCE(GetSmallIcon()));
  108.   wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  109.   wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
  110.   wndclass.lpszMenuName   = NULL;
  111.   wndclass.lpszClassName  = m_szWindowClass;
  112.   // Register the window class
  113.   if (!RegisterClassEx(&wndclass))
  114.     return FALSE;
  115.   // Calculate the window size and position based upon the game size
  116.   int iWindowWidth = m_iWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2,
  117.       iWindowHeight = m_iHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 +
  118.         GetSystemMetrics(SM_CYCAPTION);
  119.   if (wndclass.lpszMenuName != NULL)
  120.     iWindowHeight += GetSystemMetrics(SM_CYMENU);
  121.   int iXWindowPos = (GetSystemMetrics(SM_CXSCREEN) - iWindowWidth) / 2,
  122.       iYWindowPos = (GetSystemMetrics(SM_CYSCREEN) - iWindowHeight) / 2;
  123.   // Create the window
  124.   m_hWindow = CreateWindow(m_szWindowClass, m_szTitle, WS_POPUPWINDOW |
  125.     WS_CAPTION | WS_MINIMIZEBOX, iXWindowPos, iYWindowPos, iWindowWidth,
  126.     iWindowHeight, NULL, NULL, m_hInstance, NULL);
  127.   if (!m_hWindow)
  128.     return FALSE;
  129.   // Show and update the window
  130.   ShowWindow(m_hWindow, iCmdShow);
  131.   UpdateWindow(m_hWindow);
  132.   return TRUE;
  133. }
  134. LRESULT GameEngine::HandleEvent(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
  135. {
  136.   // Route Windows messages to game engine member functions
  137.   switch (msg)
  138.   {
  139.     case WM_CREATE:
  140.       // Set the game window and start the game
  141.       SetWindow(hWindow);
  142.       GameStart(hWindow);
  143.       return 0;
  144.     case WM_SETFOCUS:
  145.       // Activate the game and update the Sleep status
  146.       GameActivate(hWindow);
  147.       SetSleep(FALSE);
  148.       return 0;
  149.     case WM_KILLFOCUS:
  150.       // Deactivate the game and update the Sleep status
  151.       GameDeactivate(hWindow);
  152.       SetSleep(TRUE);
  153.       return 0;
  154.     case WM_PAINT:
  155.       HDC         hDC;
  156.       PAINTSTRUCT ps;
  157.       hDC = BeginPaint(hWindow, &ps);
  158.       // Paint the game
  159.       GamePaint(hDC);
  160.       EndPaint(hWindow, &ps);
  161.       return 0;
  162.     case WM_LBUTTONDOWN:
  163.       // Handle left mouse button press
  164.       MouseButtonDown(LOWORD(lParam), HIWORD(lParam), TRUE);
  165.       return 0;
  166.     case WM_LBUTTONUP:
  167.       // Handle left mouse button release
  168.       MouseButtonUp(LOWORD(lParam), HIWORD(lParam), TRUE);
  169.       return 0;
  170.     case WM_RBUTTONDOWN:
  171.       // Handle right mouse button press
  172.       MouseButtonDown(LOWORD(lParam), HIWORD(lParam), FALSE);
  173.       return 0;
  174.     case WM_RBUTTONUP:
  175.       // Handle right mouse button release
  176.       MouseButtonUp(LOWORD(lParam), HIWORD(lParam), FALSE);
  177.       return 0;
  178.     case WM_MOUSEMOVE:
  179.       // Handle mouse movement
  180.       MouseMove(LOWORD(lParam), HIWORD(lParam));
  181.       return 0;
  182.     case WM_DESTROY:
  183.       // End the game and exit the application
  184.       GameEnd();
  185.       PostQuitMessage(0);
  186.       return 0;
  187.   }
  188.   return DefWindowProc(hWindow, msg, wParam, lParam);
  189. }
  190. void GameEngine::ErrorQuit(LPTSTR szErrorMsg)
  191. {
  192.   MessageBox(GetWindow(), szErrorMsg, TEXT("Critical Error"), MB_OK | MB_ICONERROR);
  193.   PostQuitMessage(0);
  194. }
  195. void GameEngine::PlayMIDISong(LPTSTR szMIDIFileName, BOOL bRestart)
  196. {
  197.   // See if the MIDI player needs to be opened
  198.   if (m_uiMIDIPlayerID == 0)
  199.   {
  200.     // Open the MIDI player by specifying the device and filename
  201.     MCI_OPEN_PARMS mciOpenParms;
  202.     mciOpenParms.lpstrDeviceType = "sequencer";
  203.     mciOpenParms.lpstrElementName = szMIDIFileName;
  204.     if (mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
  205.       (DWORD_PTR)&mciOpenParms) == 0)
  206.       // Get the ID for the MIDI player
  207.       m_uiMIDIPlayerID = mciOpenParms.wDeviceID;
  208.     else
  209.       // There was a problem, so just return
  210.       return;
  211.   }
  212.   // Restart the MIDI song, if necessary
  213.   if (bRestart)
  214.   {
  215.     MCI_SEEK_PARMS mciSeekParms;
  216.     if (mciSendCommand(m_uiMIDIPlayerID, MCI_SEEK, MCI_SEEK_TO_START,
  217.       (DWORD_PTR)&mciSeekParms) != 0)
  218.       // There was a problem, so close the MIDI player
  219.       CloseMIDIPlayer();
  220.   }
  221.   // Play the MIDI song
  222.   MCI_PLAY_PARMS mciPlayParms;
  223.   if (mciSendCommand(m_uiMIDIPlayerID, MCI_PLAY, 0,
  224.     (DWORD_PTR)&mciPlayParms) != 0)
  225.     // There was a problem, so close the MIDI player
  226.     CloseMIDIPlayer();
  227. }
  228. void GameEngine::PauseMIDISong()
  229. {
  230.   // Pause the currently playing song, if possible
  231.   if (m_uiMIDIPlayerID != 0)
  232.     mciSendCommand(m_uiMIDIPlayerID, MCI_PAUSE, 0, NULL);
  233. }
  234. void GameEngine::CloseMIDIPlayer()
  235. {
  236.   // Close the MIDI player, if possible
  237.   if (m_uiMIDIPlayerID != 0)
  238.   {
  239.     mciSendCommand(m_uiMIDIPlayerID, MCI_CLOSE, 0, NULL);
  240.     m_uiMIDIPlayerID = 0;
  241.   }
  242. }