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

游戏引擎

开发平台:

Visual Basic

  1. //-----------------------------------------------------------------
  2. // UFO Application
  3. // C++ Source - UFO.cpp
  4. //-----------------------------------------------------------------
  5. //-----------------------------------------------------------------
  6. // Include Files
  7. //-----------------------------------------------------------------
  8. #include "UFO.h"
  9. //-----------------------------------------------------------------
  10. // Game Engine Functions
  11. //-----------------------------------------------------------------
  12. BOOL GameInitialize(HINSTANCE hInstance)
  13. {
  14.   // Create the game engine
  15.   g_pGame = new GameEngine(hInstance, TEXT("UFO"),
  16.     TEXT("UFO"), IDI_UFO, IDI_UFO_SM, 500, 400);
  17.   if (g_pGame == NULL)
  18.     return FALSE;
  19.   
  20.   // Set the frame rate
  21.   g_pGame->SetFrameRate(30);
  22.   // Store the instance handle
  23.   g_hInstance = hInstance;
  24.   return TRUE;
  25. }
  26. void GameStart(HWND hWindow)
  27. {
  28.   // Create and load the background and saucer bitmaps
  29.   HDC hDC = GetDC(hWindow);
  30.   g_pBackground = new Bitmap(hDC, IDB_BACKGROUND, g_hInstance);
  31.   g_pSaucer = new Bitmap(hDC, IDB_SAUCER, g_hInstance);
  32.   // Set the initial saucer position and speed
  33.   g_iSaucerLastX=g_iSaucerX = 250 - (g_pSaucer->GetWidth() / 2);
  34.   g_iSaucerLastY=g_iSaucerY = 200 - (g_pSaucer->GetHeight() / 2);
  35.   g_iSpeedX = 0;
  36.   g_iSpeedY = 0;
  37.  // Play the background music
  38.   g_pGame->PlayMIDISong(TEXT("Music.mid"));
  39. }
  40. void GameEnd()
  41. {
  42.  // Close the MIDI player for the background music
  43.   g_pGame->CloseMIDIPlayer();
  44.   // Cleanup the background and saucer bitmaps
  45.   delete g_pBackground;
  46.   delete g_pSaucer;
  47.   // Cleanup the game engine
  48.   delete g_pGame;
  49. }
  50. void GameActivate(HWND hWindow)
  51. {
  52.   // Resume the background music
  53.   g_pGame->PlayMIDISong(TEXT(""), FALSE);
  54. }
  55. void GameDeactivate(HWND hWindow)
  56. {
  57. // Pause the background music
  58.   g_pGame->PauseMIDISong();
  59. }
  60. void GamePaint(HDC hDC)
  61. {
  62.   // Draw the background and saucer bitmaps
  63.   g_pBackground->Draw(hDC, 0, 0);
  64.   g_pSaucer->Draw(hDC, g_iSaucerX, g_iSaucerY, TRUE);
  65.    
  66. }
  67. void GameCycle()
  68. {
  69.   // Update the saucer position
  70.   g_iSaucerX = min(500 - g_pSaucer->GetWidth(), max(0, g_iSaucerX + g_iSpeedX));
  71.   g_iSaucerY = min(320, max(0, g_iSaucerY + g_iSpeedY));
  72.   if(GetAsyncKeyState(VK_LEFT)==0&&GetAsyncKeyState(VK_RIGHT)==0&&GetAsyncKeyState(VK_UP) ==0&&GetAsyncKeyState(VK_DOWN) ==0)
  73.   {
  74.   g_iSpeedX=0;
  75.   g_iSpeedY=0;
  76.   }
  77. }
  78. void HandleKeys()
  79. {
  80.     HDC         hDC;
  81.     HWND        hWindow = g_pGame->GetWindow();
  82.  
  83.   // Change the speed of the saucer in response to arrow key presses
  84.   if (GetAsyncKeyState(VK_LEFT) < 0)
  85.          g_iSpeedX = max(-g_iMAXSPEED, --g_iSpeedX);             
  86.   else if (GetAsyncKeyState(VK_RIGHT) < 0)
  87.                 g_iSpeedX = min(g_iMAXSPEED, ++g_iSpeedX);
  88.           if (GetAsyncKeyState(VK_UP) < 0)
  89.                 g_iSpeedY = max(-g_iMAXSPEED, --g_iSpeedY);
  90.           else if (GetAsyncKeyState(VK_DOWN) < 0)
  91.                 g_iSpeedY = min(g_iMAXSPEED, ++g_iSpeedY);
  92. // Draw a line to the new position
  93.   hDC = GetDC(hWindow);
  94.   HPEN hPen = CreatePen(PS_SOLID, 2, RGB(19, 192, 0)); 
  95.   SelectObject(hDC, hPen);
  96.   MoveToEx(hDC,g_iSaucerLastX+(g_rcRectangle.right - g_rcRectangle.left) / 2,g_iSaucerLastY+(g_rcRectangle.bottom - g_rcRectangle.top) / 2, NULL);
  97.   LineTo(hDC,g_iSaucerX+(g_rcRectangle.right - g_rcRectangle.left) / 2,g_iSaucerY+(g_rcRectangle.bottom - g_rcRectangle.top) / 2);
  98.   g_iSaucerLastX=g_iSaucerX;
  99.   g_iSaucerLastY=g_iSaucerY;
  100. }
  101. void MouseButtonDown(int x, int y, BOOL bLeft)
  102. {
  103.   if (bLeft)
  104.   {
  105. HDC         hDC;
  106.     HWND        hWindow = g_pGame->GetWindow();
  107.     RECT        rect;
  108.     // Set the saucer position to the mouse position
  109.     g_iSaucerX = x - (g_pSaucer->GetWidth() / 2);
  110.     g_iSaucerY = y - (g_pSaucer->GetHeight() / 2);
  111.   // Draw a line to the new position
  112.   hDC = GetDC(hWindow);
  113.   HPEN hPen = CreatePen(PS_SOLID, 2, RGB(19, 192, 0)); // light green color
  114.   SelectObject(hDC, hPen);
  115.   MoveToEx(hDC,g_iSaucerLastX+(g_rcRectangle.right - g_rcRectangle.left) / 2,g_iSaucerLastY+(g_rcRectangle.bottom - g_rcRectangle.top) / 2, NULL);
  116.   
  117.  // Randomly alter the size and position of the new crop circle
  118.   GetClientRect(g_pGame->GetWindow(), &rect);
  119.   int iInflation = (rand() % 17) - 8; // increase or decrease size by up to 8
  120.   InflateRect(&g_rcRectangle, iInflation, iInflation);
  121.   OffsetRect(&g_rcRectangle, g_iSaucerX- g_rcRectangle.left,g_iSaucerY - g_rcRectangle.top);
  122.   
  123.   LineTo(hDC,g_iSaucerX+(g_rcRectangle.right - g_rcRectangle.left) / 2,g_iSaucerY+(g_rcRectangle.bottom - g_rcRectangle.top) / 2);
  124.   g_iSaucerLastX=g_iSaucerX;
  125.   g_iSaucerLastY=g_iSaucerY;
  126.    // Draw the new crop circle
  127.   HBRUSH hBrush = CreateSolidBrush(RGB(192, 92, 10));   // lighter yellow color
  128.   SelectObject(hDC, hBrush);
  129.   Ellipse(hDC, g_rcRectangle.left, g_rcRectangle.top, 
  130.     g_rcRectangle.right, g_rcRectangle.bottom);
  131.   ReleaseDC(hWindow, hDC);
  132.   DeleteObject(hBrush);
  133.   DeleteObject(hPen);
  134.   }
  135.   else
  136.   {
  137.     // Stop the saucer
  138.     g_iSpeedX = 0;
  139.     g_iSpeedY = 0;
  140.   }
  141. }
  142. void MouseButtonUp(int x, int y, BOOL bLeft)
  143. {
  144. }
  145. void MouseMove(int x, int y)
  146. {
  147. }