Hyluss icon

Superancka Gra unikaj przeszkód

Hyluss | PRO | 01/03/17 04:49:42 PM UTC | 0 ⭐ | 10480 👁️ | Never ⏰ | []
C++ (WinAPI) |

0 B

|

None

|

0 👍

/

0 👎

#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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎