Advertisement
peterzig

[PIU] Strzelanie do kurczakow

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