#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);
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎