#include #include #include using namespace std; TCHAR NazwaAplikacji[] = TEXT("Aplikacja studencka"); TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE"); HICON hAsteroid; HBITMAP bEarth, bShip, bShip_m; HACCEL Acc; TCHAR buff[32]; int nLevel = 2; int nPoints = 0; class cShip { public: int X; int Y; cShip(int x, int y): X(x), Y(y) {} void Draw(HDC hdc, HDC hdcShip, HDC hdcShip_m); }; void cShip::Draw(HDC hdc, HDC hdcShip, HDC hdcShip_m) { BitBlt(hdc, X, Y, 200, 40, hdcShip_m, 0, 0, SRCAND); BitBlt(hdc, X, Y, 200, 40, hdcShip, 0, 0, SRCPAINT); } class cAsteroid { public: int X; int Y; int Size; cAsteroid(int x, int y) : X(x), Y(y), Size(32) {} void Draw(HDC hdc); }; void cAsteroid::Draw(HDC hdc) { DrawIcon(hdc, X, Y, hAsteroid); } vectorvAsteroids; cShip *S; void Paint(HWND Okno) { PAINTSTRUCT p; HDC hdc, hdcEarth, hdcShip, hdcShip_m; hdc = BeginPaint(Okno, &p); hdcEarth = CreateCompatibleDC(hdc); hdcShip = CreateCompatibleDC(hdc); hdcShip_m = CreateCompatibleDC(hdc); HBITMAP Old = (HBITMAP)SelectObject(hdcEarth, bEarth); BitBlt(hdc, 0, 0, 1219, 916, hdcEarth, 0, 0, SRCCOPY); SelectObject(hdcShip, bShip); S->Draw(hdc, hdcShip, hdcShip_m); SelectObject(hdcEarth, Old); DeleteDC(hdcEarth); DeleteDC(hdcShip); DeleteDC(hdcShip_m); for(int i = 0; i < vAsteroids.size(); i++) { vAsteroids[i].Draw(hdc); } swprintf(buff, L"Punkty: %d", nPoints); SetWindowText(Okno, buff); EndPaint(Okno, &p); } static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam) { RECT r; RECT Ra; GetClientRect(Okno, &r); switch (Komunikat) { case WM_CREATE: S = new cShip(50, 50); SetTimer(Okno, 1, 10, 0); SetTimer(Okno, 2, 500, 0); break; case WM_TIMER: switch(LOWORD(wParam)) { case 1: for(int i = 0; i < vAsteroids.size(); i++) { vAsteroids[i].X -= nLevel; Ra.left = vAsteroids[i].X; Ra.right = vAsteroids[i].X + vAsteroids[i].Size + 20; Ra.top = vAsteroids[i].Y; Ra.bottom = vAsteroids[i].Y + 32; InvalidateRect(Okno, &Ra, 1); POINT Pa_NW; Pa_NW.x = vAsteroids[i].X; Pa_NW.y = vAsteroids[i].Y; POINT Pa_NE; Pa_NE.x = vAsteroids[i].X + 32; Pa_NE.y = vAsteroids[i].Y; POINT Pa_SW; Pa_SW.x = vAsteroids[i].X; Pa_SW.y = vAsteroids[i].Y + 32; POINT Pa_SE; Pa_SE.x = vAsteroids[i].X + 32; Pa_SE.y = vAsteroids[i].Y + 32; RECT Rs; Rs.left = S->X; Rs.right = S->X + 200; Rs.top = S->Y; Rs.bottom = S->Y + 40; if(PtInRect(&Rs, Pa_NW) || PtInRect(&Rs, Pa_NE) || PtInRect(&Rs, Pa_SW) || PtInRect(&Rs, Pa_SE)) { PostQuitMessage(0); break; } if(vAsteroids[i].X < r.left) { if(nLevel == 2)nPoints++; else if(nLevel == 5) nPoints += 2; else if(nLevel == 10) nPoints += 3; vAsteroids.erase(vAsteroids.begin() + i); } } break; case 2: cAsteroid A(r.right, rand()%r.bottom+1); vAsteroids.push_back(A); break; } break; case WM_PAINT: Paint(Okno); break; case WM_COMMAND: switch(LOWORD(wParam)) { case 40001: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40001, 0); nLevel = 2; break; case 40002: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40002, 0); nLevel = 5; break; case 40003: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40003, 0); nLevel = 10; break; case 40004: PostMessage(Okno, WM_CLOSE, wParam, lParam); break; case 4001: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40001, 0); nLevel = 2; break; case 4002: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40002, 0); nLevel = 5; break; case 4003: CheckMenuRadioItem(GetMenu(Okno), 40001, 40004, 40003, 0); nLevel = 10; break; } break; case WM_SIZE: InvalidateRect(Okno, 0, 1); break; /*case WM_MOUSEMOVE: { int nX = LOWORD(lParam); int nY = HIWORD(lParam); S->X = nX-100; S->Y = nY-27; } InvalidateRect(Okno, 0, 1); break;*/ case WM_KEYDOWN: { switch(wParam) { case VK_UP: S->Y -= 15; break; case VK_DOWN: S->Y += 15; break; case VK_LEFT: S->X -= 15; break; case VK_RIGHT: S->X += 15; break; case VK_ESCAPE: PostQuitMessage(0); break; } RECT Rs; Rs.left = S->X-10; Rs.right = S->X + 210; Rs.top = S->Y-30; Rs.bottom = S->Y+60; InvalidateRect(Okno, &Rs, 1); } break; case WM_CLOSE: DestroyWindow(Okno); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(Okno, Komunikat, wParam, lParam); } return 0; } static bool RejestrujKlasy() { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.cbClsExtra = wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) (1 + COLOR_WINDOW); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = GetModuleHandle(NULL); wc.lpfnWndProc = &FunkcjaOkienkowa; wc.lpszClassName = NazwaKlasy; wc.lpszMenuName = MAKEINTRESOURCE(1); wc.style = CS_HREDRAW | CS_VREDRAW; return (RegisterClassEx(&wc) != 0); } static void WyrejestrujKlasy() { UnregisterClass(NazwaKlasy, GetModuleHandle(NULL)); } int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc) { hAsteroid = LoadIcon(Instancja, MAKEINTRESOURCE(1)); bEarth = LoadBitmap(Instancja, MAKEINTRESOURCE(1)); bShip = LoadBitmap(Instancja, MAKEINTRESOURCE(2)); bShip_m = LoadBitmap(Instancja, MAKEINTRESOURCE(3)); Acc = LoadAccelerators(Instancja, MAKEINTRESOURCE(1)); if (!RejestrujKlasy()) { MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"), NazwaAplikacji, MB_ICONSTOP | MB_OK); return 1; } // Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd. HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, NazwaKlasy, TEXT("Space ship"), WS_OVERLAPPEDWINDOW, 0, 0, 1200, 800, NULL,NULL, Instancja, NULL); if (GlowneOkno == NULL) { MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"), NazwaAplikacji, MB_ICONSTOP | MB_OK); return 2; } // Wyświetl i uaktualnij nowo stworzone okno. ShowWindow(GlowneOkno, Widocznosc); UpdateWindow(GlowneOkno); // Główna pętla komunikatów wątku. MSG Komunikat; while (GetMessage(&Komunikat, NULL, 0, 0) > 0) { if(!TranslateAccelerator(GlowneOkno, Acc, &Komunikat)) { TranslateMessage(&Komunikat); DispatchMessage(&Komunikat); } } // Zwolnij pamięć klas i zakończ proces. WyrejestrujKlasy(); return static_cast(Komunikat.wParam); }