Advertisement
Hyluss

Superancka Gra unikaj przeszkód

Jan 3rd, 2017
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. TCHAR NazwaAplikacji[] = TEXT("Aplikacja studencka");
  8. TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE");
  9.  
  10. HICON hAsteroid;
  11. HBITMAP bEarth, bShip, bShip_m;
  12. HACCEL Acc;
  13.  
  14. TCHAR buff[32];
  15.  
  16. int nLevel = 2;
  17. int nPoints = 0;
  18.  
  19. class cShip
  20. {
  21. public:
  22.     int X;
  23.     int Y;
  24.     cShip(int x, int y): X(x), Y(y) {}
  25.     void Draw(HDC hdc, HDC hdcShip, HDC hdcShip_m);
  26. };
  27.  
  28. void cShip::Draw(HDC hdc, HDC hdcShip, HDC hdcShip_m)
  29. {
  30.     BitBlt(hdc, X, Y, 200, 40, hdcShip_m, 0, 0, SRCAND);
  31.     BitBlt(hdc, X, Y, 200, 40, hdcShip, 0, 0, SRCPAINT);
  32. }
  33.  
  34. class cAsteroid
  35. {
  36. public:
  37.     int X;
  38.     int Y;
  39.     int Size;
  40.     cAsteroid(int x, int y) : X(x), Y(y), Size(32) {}
  41.     void Draw(HDC hdc);
  42. };
  43.  
  44. void cAsteroid::Draw(HDC hdc)
  45. {
  46.     DrawIcon(hdc, X, Y, hAsteroid);
  47. }
  48.  
  49. vector<cAsteroid>vAsteroids;
  50.  
  51. cShip *S;
  52.  
  53. void Paint(HWND Okno)
  54. {
  55.     PAINTSTRUCT p;
  56.     HDC hdc, hdcEarth, hdcShip, hdcShip_m;
  57.     hdc = BeginPaint(Okno, &p);
  58.  
  59.  
  60.     hdcEarth = CreateCompatibleDC(hdc);
  61.     hdcShip = CreateCompatibleDC(hdc);
  62.     hdcShip_m = CreateCompatibleDC(hdc);
  63.     HBITMAP Old = (HBITMAP)SelectObject(hdcEarth, bEarth);
  64.     BitBlt(hdc, 0, 0, 1219, 916, hdcEarth, 0, 0, SRCCOPY);
  65.     SelectObject(hdcShip, bShip);
  66.     S->Draw(hdc, hdcShip, hdcShip_m);
  67.  
  68.     SelectObject(hdcEarth, Old);
  69.     DeleteDC(hdcEarth);
  70.     DeleteDC(hdcShip);
  71.     DeleteDC(hdcShip_m);
  72.     for(int i = 0; i < vAsteroids.size(); i++)
  73.     {
  74.         vAsteroids[i].Draw(hdc);
  75.     }
  76.     swprintf(buff, L"Punkty: %d", nPoints);
  77.     SetWindowText(Okno, buff);
  78.     EndPaint(Okno, &p);
  79. }
  80.  
  81. static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam)
  82. {
  83.     RECT r;
  84.     RECT Ra;
  85.     GetClientRect(Okno, &r);
  86.     switch (Komunikat)
  87.     {
  88.     case WM_CREATE:
  89.         S = new cShip(50, 50);
  90.         SetTimer(Okno, 1, 10, 0);
  91.         SetTimer(Okno, 2, 500, 0);
  92.         break;
  93.     case WM_TIMER:
  94.         switch(LOWORD(wParam))
  95.         {
  96.         case 1:
  97.             for(int i = 0; i < vAsteroids.size(); i++)
  98.             {
  99.                 vAsteroids[i].X -= nLevel;
  100.                 Ra.left = vAsteroids[i].X;
  101.                 Ra.right = vAsteroids[i].X + vAsteroids[i].Size + 20;
  102.                 Ra.top = vAsteroids[i].Y;
  103.                 Ra.bottom = vAsteroids[i].Y + 32;
  104.                 InvalidateRect(Okno, &Ra, 1);
  105.  
  106.                 POINT Pa_NW;
  107.                 Pa_NW.x = vAsteroids[i].X;
  108.                 Pa_NW.y = vAsteroids[i].Y;
  109.  
  110.                 POINT Pa_NE;
  111.                 Pa_NE.x = vAsteroids[i].X + 32;
  112.                 Pa_NE.y = vAsteroids[i].Y;
  113.  
  114.                 POINT Pa_SW;
  115.                 Pa_SW.x = vAsteroids[i].X;
  116.                 Pa_SW.y = vAsteroids[i].Y + 32;
  117.  
  118.                 POINT Pa_SE;
  119.                 Pa_SE.x = vAsteroids[i].X + 32;
  120.                 Pa_SE.y = vAsteroids[i].Y + 32;
  121.  
  122.                 RECT Rs;
  123.                 Rs.left = S->X;
  124.                 Rs.right = S->X + 200;
  125.                 Rs.top = S->Y;
  126.                 Rs.bottom = S->Y + 40;
  127.  
  128.                 if(PtInRect(&Rs, Pa_NW) || PtInRect(&Rs, Pa_NE) || PtInRect(&Rs, Pa_SW) || PtInRect(&Rs, Pa_SE))
  129.                 {
  130.                     PostQuitMessage(0);
  131.                     break;
  132.                 }
  133.                 if(vAsteroids[i].X < r.left)
  134.                 {
  135.                     if(nLevel == 2)nPoints++;
  136.                     else if(nLevel == 5) nPoints += 2;
  137.                     else if(nLevel == 10) nPoints += 3;
  138.                     vAsteroids.erase(vAsteroids.begin() + i);
  139.                 }
  140.             }
  141.             break;
  142.         case 2:
  143.             cAsteroid A(r.right, rand()%r.bottom+1);
  144.             vAsteroids.push_back(A);
  145.             break;
  146.         }
  147.         break;
  148.     case WM_PAINT:
  149.         Paint(Okno);
  150.         break;
  151.     case WM_COMMAND:
  152.         switch(LOWORD(wParam))
  153.         {
  154.         case 40001:
  155.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40001, 0);
  156.             nLevel = 2;
  157.             break;
  158.         case 40002:
  159.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40002, 0);
  160.             nLevel = 5;
  161.             break;
  162.         case 40003:
  163.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40003, 0);
  164.             nLevel = 10;
  165.             break;
  166.         case 40004:
  167.             PostMessage(Okno, WM_CLOSE, wParam, lParam);
  168.             break;
  169.         case 4001:
  170.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40001, 0);
  171.             nLevel = 2;
  172.             break;
  173.         case 4002:
  174.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40002, 0);
  175.             nLevel = 5;
  176.             break;
  177.         case 4003:
  178.             CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40003, 0);
  179.             nLevel = 10;
  180.             break;
  181.         }
  182.         break;
  183.     case WM_SIZE:
  184.         InvalidateRect(Okno, 0, 1);
  185.         break;
  186.     /*case WM_MOUSEMOVE:
  187.         {
  188.             int nX = LOWORD(lParam);
  189.             int nY = HIWORD(lParam);
  190.             S->X = nX-100;
  191.             S->Y = nY-27;
  192.         }
  193.         InvalidateRect(Okno, 0, 1);
  194.         break;*/
  195.     case WM_KEYDOWN:
  196.         {
  197.             switch(wParam)
  198.             {
  199.             case VK_UP:
  200.                 S->Y -= 15;
  201.                 break;
  202.             case VK_DOWN:
  203.                 S->Y += 15;
  204.                 break;
  205.             case VK_LEFT:
  206.                 S->X -= 15;
  207.                 break;
  208.             case VK_RIGHT:
  209.                 S->X += 15;
  210.                 break;
  211.             case VK_ESCAPE:
  212.                 PostQuitMessage(0);
  213.                 break;
  214.             }
  215.             RECT Rs;
  216.             Rs.left = S->X-10;
  217.             Rs.right = S->X + 210;
  218.             Rs.top = S->Y-30;
  219.             Rs.bottom = S->Y+60;
  220.             InvalidateRect(Okno, &Rs, 1);
  221.         }
  222.         break;
  223.     case WM_CLOSE:
  224.         DestroyWindow(Okno);
  225.         break;
  226.     case WM_DESTROY:
  227.         PostQuitMessage(0);
  228.         break;
  229.     default:
  230.         return DefWindowProc(Okno, Komunikat, wParam, lParam);
  231.     }
  232.     return 0;
  233. }
  234.  
  235. static bool RejestrujKlasy()
  236. {
  237.     WNDCLASSEX wc;
  238.     wc.cbSize = sizeof(WNDCLASSEX);
  239.     wc.cbClsExtra = wc.cbWndExtra = 0;
  240.     wc.hbrBackground = (HBRUSH) (1 + COLOR_WINDOW);
  241.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  242.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  243.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  244.     wc.hInstance = GetModuleHandle(NULL);
  245.     wc.lpfnWndProc = &FunkcjaOkienkowa;
  246.     wc.lpszClassName = NazwaKlasy;
  247.     wc.lpszMenuName = MAKEINTRESOURCE(1);
  248.     wc.style = CS_HREDRAW | CS_VREDRAW;
  249.     return (RegisterClassEx(&wc) != 0);
  250. }
  251.  
  252. static void WyrejestrujKlasy()
  253. {
  254.     UnregisterClass(NazwaKlasy, GetModuleHandle(NULL));
  255. }
  256.  
  257. int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc)
  258. {
  259.     hAsteroid = LoadIcon(Instancja, MAKEINTRESOURCE(1));
  260.  
  261.     bEarth = LoadBitmap(Instancja, MAKEINTRESOURCE(1));
  262.     bShip = LoadBitmap(Instancja, MAKEINTRESOURCE(2));
  263.     bShip_m = LoadBitmap(Instancja, MAKEINTRESOURCE(3));
  264.  
  265.     Acc = LoadAccelerators(Instancja, MAKEINTRESOURCE(1));
  266.  
  267.     if (!RejestrujKlasy()) {
  268.         MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"),
  269.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  270.         return 1;
  271.     }
  272.     // Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd.
  273.    
  274.  
  275.     HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE,
  276.         NazwaKlasy, TEXT("Space ship"), WS_OVERLAPPEDWINDOW,
  277.         0, 0, 1200, 800,
  278.         NULL,NULL, Instancja, NULL);
  279.     if (GlowneOkno == NULL) {
  280.         MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"),
  281.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  282.         return 2;
  283.     }
  284.     // Wyświetl i uaktualnij nowo stworzone okno.
  285.     ShowWindow(GlowneOkno, Widocznosc);
  286.     UpdateWindow(GlowneOkno);
  287.     // Główna pętla komunikatów wątku.
  288.     MSG Komunikat;
  289.     while (GetMessage(&Komunikat, NULL, 0, 0) > 0) {
  290.         if(!TranslateAccelerator(GlowneOkno, Acc, &Komunikat))
  291.         {
  292.             TranslateMessage(&Komunikat);
  293.             DispatchMessage(&Komunikat);
  294.         }
  295.     }
  296.     // Zwolnij pamięć klas i zakończ proces.
  297.     WyrejestrujKlasy();
  298.     return static_cast<int>(Komunikat.wParam);
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement