Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <windows.h>
- #include <vector>
- 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);
- }
- vector<cAsteroid>vAsteroids;
- 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<int>(Komunikat.wParam);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement