Advertisement
Guest User

kurka

a guest
Dec 18th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.69 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <deque>
  3. #include <time.h>
  4.  
  5. using namespace std;
  6.  
  7. #define ID_TIMER1 1
  8. #define ID_TIMER2 2
  9. #define ID_TIMER3 3
  10.  
  11. enum Direction
  12. {
  13. LEFT,
  14. RIGHT,
  15. NONE
  16. };
  17.  
  18. struct Naboj
  19. {
  20. RECT surface;
  21. };
  22.  
  23. struct Kurka
  24. {
  25. RECT surface;
  26. Direction dir;
  27. int speed;
  28. int yVel;
  29. };
  30.  
  31. bool checkCollision(RECT r, LPARAM lParam)
  32. {
  33. DWORD mouseX = LOWORD(lParam);
  34. DWORD mouseY = HIWORD(lParam);
  35.  
  36. if (mouseX > r.left && mouseX < r.right && mouseY > r.top && mouseY < r.bottom)
  37. return true;
  38. return false;
  39. }
  40.  
  41. deque<Naboj> naboje;
  42. deque<Kurka> kurki;
  43.  
  44. TCHAR className[] = TEXT("Nazwa_klasy");
  45. TCHAR appName[] = TEXT("Kurka wodna");
  46.  
  47. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  48. {
  49. static BITMAP bgInfo, kurkaInfo, nabojInfo;
  50. static HBITMAP bg, kurka, kurkaMask, naboj, nabojMask;
  51. static RECT clientRect;
  52. HDC hdc, hdcMem;
  53. PAINTSTRUCT ps;
  54. static bool clicked = false;
  55. static int hit = 0;
  56. TCHAR buff[16];
  57.  
  58. switch (msg)
  59. {
  60. case WM_CREATE:
  61. SetTimer(hwnd, ID_TIMER1, 10, NULL);
  62. SetTimer(hwnd, ID_TIMER2, 100, NULL);
  63. SetTimer(hwnd, ID_TIMER3, 1500, NULL);
  64. GetClientRect(hwnd, &clientRect);
  65. bg = (HBITMAP)LoadImage(NULL, TEXT("imgs/bg.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  66. kurka = (HBITMAP)LoadImage(NULL, TEXT("imgs/kurka.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  67. kurkaMask = (HBITMAP)LoadImage(NULL, TEXT("imgs/kurkaMask.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  68. naboj = (HBITMAP)LoadImage(NULL, TEXT("imgs/naboj.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  69. nabojMask = (HBITMAP)LoadImage(NULL, TEXT("imgs/nabojMask.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  70.  
  71. GetObject(bg, sizeof(bgInfo), &bgInfo);
  72. GetObject(kurka, sizeof(kurkaInfo), &kurkaInfo);
  73. GetObject(naboj, sizeof(nabojInfo), &nabojInfo);
  74.  
  75. for (int i = 0; i < 3; i++)
  76. {
  77. Naboj n;
  78. n.surface.left = 10 * (i * 3);
  79. n.surface.top = clientRect.bottom - nabojInfo.bmHeight;
  80. n.surface.right = n.surface.left + nabojInfo.bmWidth;
  81. n.surface.bottom = clientRect.bottom;
  82. naboje.push_back(n);
  83. }
  84. break;
  85.  
  86. case WM_PAINT:
  87. hdc = BeginPaint(hwnd, &ps);
  88. hdcMem = CreateCompatibleDC(hdc);
  89.  
  90. SelectObject(hdcMem, bg);
  91. BitBlt(hdc, 0, 0, bgInfo.bmWidth, bgInfo.bmHeight, hdcMem, 0, 0, SRCCOPY);
  92.  
  93. if (kurki.size() > 0)
  94. for (deque<Kurka>::iterator it = kurki.begin(); it != kurki.end(); it++)
  95. {
  96. SelectObject(hdcMem, kurkaMask);
  97. BitBlt(hdc, it->surface.left, it->surface.top, kurkaInfo.bmWidth, kurkaInfo.bmHeight, hdcMem, 0, 0, SRCAND);
  98. SelectObject(hdcMem, kurka);
  99. BitBlt(hdc, it->surface.left, it->surface.top, kurkaInfo.bmWidth, kurkaInfo.bmHeight, hdcMem, 0, 0, SRCPAINT);
  100. }
  101.  
  102. if (naboje.size() > 0)
  103. for (deque<Naboj>::iterator it = naboje.begin(); it != naboje.end(); it++)
  104. {
  105. SelectObject(hdcMem, nabojMask);
  106. BitBlt(hdc, it->surface.left, it->surface.top, kurkaInfo.bmWidth, kurkaInfo.bmHeight, hdcMem, 0, 0, SRCAND);
  107. SelectObject(hdcMem, naboj);
  108. BitBlt(hdc, it->surface.left, it->surface.top, kurkaInfo.bmWidth, kurkaInfo.bmHeight, hdcMem, 0, 0, SRCPAINT);
  109. }
  110.  
  111. DeleteDC(hdcMem);
  112. EndPaint(hwnd, &ps);
  113. break;
  114.  
  115. case WM_TIMER:
  116. switch (wParam)
  117. {
  118. case ID_TIMER1:
  119. InvalidateRect(hwnd, NULL, FALSE);
  120. if (kurki.size() > 0)
  121. for (deque<Kurka>::iterator it = kurki.begin(); it != kurki.end(); it++)
  122. {
  123. it->surface.left += it->speed;
  124. it->surface.right += it->speed;
  125. }
  126. swprintf(buff, 16, TEXT("Trafione: %d"), hit);
  127. SetWindowText(hwnd, buff);
  128. break;
  129.  
  130. case ID_TIMER2:
  131. if (kurki.size() > 0)
  132. for (deque<Kurka>::iterator it = kurki.begin(); it != kurki.end(); it++)
  133. {
  134. it->yVel = rand() % 20 + (-10);
  135. it->surface.top += it->yVel;
  136. it->surface.bottom += it->yVel;
  137. }
  138. break;
  139.  
  140. case ID_TIMER3:
  141. {
  142. Kurka k;
  143. k.dir = static_cast<Direction>(rand() % NONE);
  144. if (k.dir == LEFT)
  145. {
  146. k.surface.left = -kurkaInfo.bmWidth;
  147. k.surface.top = rand() % clientRect.bottom;
  148. k.surface.right = k.surface.left + kurkaInfo.bmWidth;
  149. k.surface.bottom = k.surface.top + kurkaInfo.bmHeight;
  150. k.speed = 5;
  151. }
  152. else
  153. {
  154. k.surface.left = clientRect.right;
  155. k.surface.top = rand() % clientRect.bottom / 2;
  156. k.surface.right = clientRect.right + kurkaInfo.bmWidth;
  157. k.surface.bottom = k.surface.top + kurkaInfo.bmHeight;
  158. k.speed = -5;
  159. }
  160. kurki.push_back(k);
  161. }
  162. break;
  163. }
  164. break;
  165.  
  166. case WM_LBUTTONUP:
  167. if (naboje.size() > 0)
  168. {
  169. if (kurki.size() > 0)
  170. for (deque<Kurka>::iterator it = kurki.begin(); it != kurki.end(); it++)
  171. {
  172. if (checkCollision(it->surface, lParam))
  173. {
  174. hit++;
  175. kurki.erase(it);
  176. break;
  177. }
  178. }
  179.  
  180. for (deque<Naboj>::iterator it = naboje.begin(); it != naboje.end(); it++)
  181. {
  182. naboje.erase(it);
  183. break;
  184. }
  185. }
  186. break;
  187.  
  188.  
  189. case WM_KEYDOWN:
  190. switch ((int)wParam)
  191. {
  192. case VK_HOME:
  193. if (naboje.size() == 0)
  194. {
  195. for (int i = 0; i < 3; i++)
  196. {
  197. Naboj n;
  198. n.surface.left = 10 * (i * 3);
  199. n.surface.top = clientRect.bottom - nabojInfo.bmHeight;
  200. n.surface.right = n.surface.left + nabojInfo.bmWidth;
  201. n.surface.bottom = clientRect.bottom;
  202. naboje.push_back(n);
  203. }
  204. }
  205. break;
  206. }
  207. break;
  208.  
  209. case WM_CLOSE:
  210. if (MessageBox(0, TEXT("Czy na pewno chcesz zakończyć działanie aplikacji?"), appName, MB_YESNO) == IDYES)
  211. DestroyWindow(hwnd);
  212. break;
  213.  
  214. case WM_DESTROY:
  215. KillTimer(hwnd, ID_TIMER1);
  216. KillTimer(hwnd, ID_TIMER2);
  217. KillTimer(hwnd, ID_TIMER3);
  218. PostQuitMessage(0);
  219. break;
  220. default:
  221. return DefWindowProc(hwnd, msg, wParam, lParam);
  222. }
  223. }
  224.  
  225. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow)
  226. {
  227. WNDCLASSEX wC = { 0 };
  228. HWND hwnd = NULL;
  229. MSG msg;
  230.  
  231. wC.cbSize = sizeof(WNDCLASSEX);
  232. wC.style = CS_VREDRAW | CS_HREDRAW;
  233. wC.cbClsExtra = NULL;
  234. wC.cbWndExtra = NULL;
  235. wC.hInstance = hInstance;
  236. wC.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  237. wC.lpfnWndProc = WndProc;
  238. wC.lpszClassName = className;
  239. wC.lpszMenuName = 0;
  240. wC.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  241. wC.hIconSm = NULL;
  242. wC.hCursor = LoadCursor(NULL, IDC_ARROW);
  243.  
  244. ATOM result = RegisterClassEx(&wC);
  245. if (!result)
  246. {
  247. MessageBox(0, TEXT("Błąd funkcji RegisterClassEx"), appName, MB_OK);
  248. }
  249.  
  250. hwnd = CreateWindow(
  251. className,
  252. appName,
  253. WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  254. 100,
  255. 100,
  256. 1000,
  257. 800,
  258. NULL,
  259. NULL,
  260. hInstance,
  261. NULL
  262. );
  263.  
  264. ShowWindow(hwnd, nCmdShow);
  265. UpdateWindow(hwnd);
  266. while (GetMessage(&msg, NULL, 0, 0))
  267. {
  268. TranslateMessage(&msg);
  269. DispatchMessage(&msg);
  270. }
  271.  
  272. UnregisterClass(className, hInstance);
  273. return msg.wParam;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement