peterzig

[PIU] Kurka Wodna

Jan 1st, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.91 KB | None | 0 0
  1. #include <windows.h>
  2. #include <deque>
  3. #include <time.h>
  4.  
  5. #define SCREEN_WIDTH 1000
  6. #define SCREEN_HEIGHT 800
  7. #define TIMER_ID1 1
  8. #define TIMER_ID2 2
  9. #define TIMER_ID3 3
  10. #define BULLET_SIZE 10
  11. #define EXPOLE_SQUARE_SIZE 20
  12.  
  13. TCHAR className[] = TEXT("Class");
  14. TCHAR appName[] = TEXT("Gra z jakimiś gównami, grunt że śmiga");
  15.  
  16. HWND hwnd;
  17. MSG msg;
  18.  
  19. struct Container {
  20.     float x, y;
  21.     UINT sizeX, sizeY;
  22.     float xVel, yVel;
  23. };
  24.  
  25. std::deque<Container> bullets;
  26.  
  27. Container player;
  28. Container enemy;
  29.  
  30. HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
  31. {
  32.     HDC hdcMem, hdcMem2;
  33.     HBITMAP hbmMask, hbmOld, hbmOld2;
  34.     BITMAP bm;
  35.  
  36.     GetObject(hbmColour, sizeof(BITMAP), &bm);
  37.     hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
  38.  
  39.     hdcMem = CreateCompatibleDC(NULL);
  40.     hdcMem2 = CreateCompatibleDC(NULL);
  41.  
  42.     hbmOld = (HBITMAP)SelectObject(hdcMem, hbmColour);
  43.     hbmOld2 = (HBITMAP)SelectObject(hdcMem2, hbmMask);
  44.  
  45.     SetBkColor(hdcMem, crTransparent);
  46.  
  47.     BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
  48.     BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);
  49.  
  50.     SelectObject(hdcMem, hbmOld);
  51.     SelectObject(hdcMem2, hbmOld2);
  52.     DeleteDC(hdcMem);
  53.     DeleteDC(hdcMem2);
  54.  
  55.     return hbmMask;
  56. }
  57.  
  58. void addBullet() {
  59.     Container container;
  60.     container.x = enemy.x + (enemy.sizeX / 2) + (BULLET_SIZE / 2);
  61.     container.y = enemy.y + (enemy.sizeY / 2);
  62.     container.sizeX = BULLET_SIZE;
  63.     container.sizeY = container.sizeX * 2;
  64.     container.xVel = 0;
  65.     container.yVel = 5;
  66.  
  67.     bullets.push_back(container);
  68. }
  69.  
  70. int randomEnemyVelocity() {
  71.     return (rand() % 20) - 10;
  72. }
  73.  
  74. bool checkCollision(Container A, Container B)
  75. {
  76.     RECT objectA, objectB;
  77.  
  78.     objectA.left = A.x;
  79.     objectA.right = A.x + A.sizeX;
  80.     objectA.top = A.y;
  81.     objectA.bottom = A.y + A.sizeY;
  82.  
  83.     objectB.left = B.x;
  84.     objectB.right = B.x + B.sizeX;
  85.     objectB.top = B.y;
  86.     objectB.bottom = B.y + B.sizeY;
  87.  
  88.     if (objectA.bottom <= objectB.top)
  89.     {
  90.         return false;
  91.     }
  92.  
  93.     if (objectA.top >= objectB.bottom)
  94.     {
  95.         return false;
  96.     }
  97.  
  98.     if (objectA.right <= objectB.left)
  99.     {
  100.         return false;
  101.     }
  102.  
  103.     if (objectA.left >= objectB.right)
  104.     {
  105.         return false;
  106.     }
  107.  
  108.     return true;
  109. }
  110.  
  111. void enemyUpdate(RECT clientRect) {
  112.     enemy.x += enemy.xVel;
  113.  
  114.     if (enemy.x + enemy.xVel < 0) {
  115.         enemy.x = enemy.xVel;
  116.         enemy.xVel = -enemy.xVel;
  117.     }
  118.  
  119.     else if (enemy.x + enemy.xVel > clientRect.right - enemy.sizeX) {
  120.         enemy.x = clientRect.right - enemy.sizeX - enemy.xVel;
  121.         enemy.xVel = -enemy.xVel;
  122.     }
  123. }
  124.  
  125. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  126.     static RECT clientRect;
  127.     static HBITMAP backgroundBitMap, playerBitmap, playerMask, enemyBitmap, enemyMask;
  128.     static PAINTSTRUCT ps;
  129.     static BITMAP bgInfo, playerInfo, enemyInfo;
  130.     static HBRUSH whiteColor;
  131.     static UINT score = 0;
  132.  
  133.     switch (msg) {
  134.     case WM_CREATE: {
  135.         srand(time(NULL));
  136.         GetClientRect(hwnd, &clientRect);
  137.         SetTimer(hwnd, TIMER_ID1, 20, NULL);
  138.         SetTimer(hwnd, TIMER_ID2, 3000, NULL);
  139.         SetTimer(hwnd, TIMER_ID3, 50, NULL);
  140.  
  141.         whiteColor = (HBRUSH)CreateSolidBrush(RGB(255, 255, 255));
  142.  
  143.         backgroundBitMap = (HBITMAP)LoadImage(NULL, TEXT("_background.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  144.         playerBitmap = (HBITMAP)LoadImage(NULL, TEXT("_player.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  145.         playerMask = CreateBitmapMask(playerBitmap, RGB(0, 0, 0));
  146.         enemyBitmap = (HBITMAP)LoadImage(NULL, TEXT("_enemy.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  147.         enemyMask = CreateBitmapMask(enemyBitmap, RGB(0, 0, 0));
  148.  
  149.         GetObject(backgroundBitMap, sizeof(bgInfo), &bgInfo);
  150.         GetObject(enemyBitmap, sizeof(enemyInfo), &enemyInfo);
  151.         GetObject(playerBitmap, sizeof(playerInfo), &playerInfo);
  152.  
  153.         player.sizeX = playerInfo.bmWidth;
  154.         player.sizeY = playerInfo.bmHeight;
  155.         player.x = (clientRect.right / 2) - (player.sizeX / 2);
  156.         player.y = clientRect.bottom - (clientRect.bottom / 4);
  157.  
  158.         enemy.sizeX = enemyInfo.bmWidth;
  159.         enemy.sizeY = enemyInfo.bmHeight;
  160.         enemy.x = (clientRect.right / 2) - (enemy.sizeX / 2);
  161.         enemy.y = 100;
  162.     }break;
  163.  
  164.     case WM_PAINT: {
  165.         HDC hdc = BeginPaint(hwnd, &ps);
  166.  
  167.         /////////////////////////////////////////////////////////////////////
  168.  
  169.         HDC hdcNowy = CreateCompatibleDC(hdc);
  170.         HBITMAP hbmOld = (HBITMAP)SelectObject(hdcNowy, backgroundBitMap);
  171.         BitBlt(hdc, 0, 0, bgInfo.bmWidth, bgInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY);
  172.  
  173.         SelectObject(hdcNowy, hbmOld);
  174.  
  175.         /////////////////////////////////////////////////////////////////////
  176.  
  177.         SelectObject(hdc, whiteColor);
  178.  
  179.         for (std::deque<Container>::iterator it = bullets.begin(); it != bullets.end(); ++it)
  180.             Ellipse(hdc, it->x, it->y, it->x + it->sizeX, it->y + it->sizeY);
  181.  
  182.         /////////////////////////////////////////////////////////////////////
  183.  
  184.         hbmOld = (HBITMAP)SelectObject(hdcNowy, playerMask);
  185.  
  186.         BitBlt(hdc, player.x, player.y, player.sizeX, player.sizeY, hdcNowy, 0, 0, SRCAND);
  187.         SelectObject(hdcNowy, playerBitmap);
  188.         BitBlt(hdc, player.x, player.y, player.sizeX, player.sizeY, hdcNowy, 0, 0, SRCPAINT);
  189.  
  190.         SelectObject(hdcNowy, hbmOld);
  191.  
  192.         /////////////////////////////////////////////////////////////////////
  193.  
  194.         hbmOld = (HBITMAP)SelectObject(hdcNowy, enemyMask);
  195.  
  196.         BitBlt(hdc, enemy.x, enemy.y, enemy.sizeX, enemy.sizeY, hdcNowy, 0, 0, SRCAND);
  197.         SelectObject(hdcNowy, enemyBitmap);
  198.         BitBlt(hdc, enemy.x, enemy.y, enemy.sizeX, enemy.sizeY, hdcNowy, 0, 0, SRCPAINT);
  199.  
  200.         SelectObject(hdcNowy, hbmOld);
  201.  
  202.         DeleteDC(hdcNowy);
  203.         EndPaint(hwnd, &ps);
  204.     }break;
  205.  
  206.     case WM_TIMER: {
  207.         switch (wParam) {
  208.         case TIMER_ID1: {
  209.             for (std::deque<Container>::iterator it = bullets.begin(); it != bullets.end(); ++it) {
  210.                 it->y += it->yVel;
  211.                 it->x += it->xVel;
  212.  
  213.                 if (it->y > clientRect.bottom) {
  214.                     bullets.erase(it);
  215.                     break;
  216.                 }
  217.             }
  218.  
  219.             enemyUpdate(clientRect);
  220.  
  221.             for (std::deque<Container>::iterator b = bullets.begin(); b != bullets.end(); ++b)
  222.                 if (checkCollision(*b, player)) {
  223.                     score += 10;
  224.                     bullets.erase(b);
  225.                     break;
  226.                 }
  227.  
  228.             InvalidateRect(hwnd, NULL, 0);
  229.         }break;
  230.  
  231.         case TIMER_ID2:
  232.             enemy.xVel = randomEnemyVelocity();
  233.             break;
  234.  
  235.         case TIMER_ID3:
  236.             addBullet();
  237.             break;
  238.         }break;
  239.     }break;
  240.  
  241.     case WM_KEYDOWN:
  242.         switch ((int)wParam)
  243.         {
  244.         case VK_RIGHT:
  245.             if (player.x + 5 < clientRect.right - player.sizeX)
  246.                 player.x += 5;
  247.             break;
  248.  
  249.         case VK_LEFT:
  250.             if (player.x - 5 > 0)
  251.                 player.x -= 5;
  252.             break;
  253.  
  254.         case VK_SPACE:
  255.             addBullet();
  256.             break;
  257.  
  258.         default:
  259.             break;
  260.         }
  261.         break;
  262.  
  263.     case WM_CLOSE:
  264.         DestroyWindow(hwnd);
  265.         break;
  266.  
  267.     case WM_DESTROY: {
  268.         KillTimer(hwnd, TIMER_ID1);
  269.         KillTimer(hwnd, TIMER_ID2);
  270.         KillTimer(hwnd, TIMER_ID3);
  271.         PostQuitMessage(0);
  272.     }break;
  273.  
  274.     default:
  275.         return DefWindowProc(hwnd, msg, wParam, lParam);
  276.     }
  277.  
  278.     return 0;
  279. }
  280.  
  281. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  282. {
  283.     WNDCLASSEX wc;
  284.     wc.cbSize = sizeof(WNDCLASSEX);
  285.     wc.style = 0;
  286.     wc.cbClsExtra = 0;
  287.     wc.cbWndExtra = 0;
  288.     wc.hInstance = hInstance;
  289.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  290.     wc.lpfnWndProc = WndProc;
  291.     wc.lpszClassName = className;
  292.     wc.lpszMenuName = NULL;
  293.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  294.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  295.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  296.  
  297.     if (RegisterClassEx(&wc) == 0) {
  298.         MessageBox(NULL, TEXT("Some problem with RegisterClassEx"), className, MB_OK);
  299.         return 1;
  300.     }
  301.  
  302.     hwnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, className, appName, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, hInstance, 0);
  303.     if (hwnd == NULL) {
  304.         MessageBox(NULL, TEXT("Some problem with CreateWindowEx by hwnd"), className, MB_OK);
  305.         return 1;
  306.     }
  307.  
  308.     ShowWindow(hwnd, nCmdShow);
  309.     UpdateWindow(hwnd);
  310.  
  311.     while (GetMessage(&msg, NULL, 0, 0) > 0)
  312.     {
  313.         TranslateMessage(&msg);
  314.         DispatchMessage(&msg);
  315.     }
  316.  
  317.     UnregisterClass(className, hInstance);
  318.  
  319.     return msg.wParam;
  320. }
Add Comment
Please, Sign In to add comment