Tutorial 2_4

Spielgrundprogramm

______________________________________________________________________
// 2_4 Spielgrundprogramm

#define WIN32_LEAN_AND_MEAN
#include <windows.h>



char Spielname[] = "Spielgrundprogramm";
BOOL ende;
// Spieler
struct bewegliches_Objekt
{
    int x;
    int y;
} Spieler;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam,
                            LPARAM lparam)
{
    switch(message)
    {
    case WM_DESTROY:
        {PostQuitMessage(0);
        ende = TRUE;
        return(0);
        } break;
    case WM_KEYDOWN:
        switch (wparam)
        {
        case VK_ESCAPE: // Wenn der Spieler Esc drückt, beende das Programm
            {
                PostMessage(hwnd, WM_CLOSE, 0, 0);
                return 0;
            }
            break;
        break;
        // Bewege den Spieler mit den Pfeiltasten
        case VK_LEFT:
            Spieler.x--;
            break;
        case VK_RIGHT:
            Spieler.x++;
            break;
        case VK_UP:
            Spieler.y--;
            break;
        case VK_DOWN:
            Spieler.y++;
            break;
        default:
            break;
        }
    }

    return (DefWindowProc(hwnd, message, wparam, lparam));
    
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,
                  LPSTR lpcmdline, int ncmdshow)
{

    WNDCLASSEX winclass;
    HWND       hwnd;
    MSG        message;
    const char szclassname[] = "USF 4 ever";

    winclass.cbSize        = sizeof(WNDCLASSEX);
    winclass.style         = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc   = WindowProc;
    winclass.cbClsExtra    = 0;
    winclass.cbWndExtra    = 0;
    winclass.hInstance     = hinst;
    winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winclass.lpszMenuName  = NULL;
    winclass.lpszClassName = szclassname;
    winclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&winclass))
        return(0);

    if (!
            (hwnd = CreateWindowEx(

                                    NULL,
                                    szclassname,
                                    Spielname,
                                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                    0,0,
                                    400,300,
                                    NULL,
                                    NULL,
                                    hinst,
                                    NULL
                                )
            )
        )
        return(0);

    // Spiel initialisieren
    // Spieler in die Mitte des Fensters setzen
    RECT rect;
    GetClientRect(hwnd, &rect);
    Spieler.x = rect.right/2;
    Spieler.y = rect.bottom/2;

    // Hauptspielschleife
    while(!ende)
    {
        /* Während GeMessage solange läuft, bis Windows eine Nachricht
            schickt, beendet sich PeekMessage, wenn keine Nachricht zur
            Verarbeitung vorliegt, sofort selber, spart also etwas Zeit */
        while(PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
        HDC hdc = GetDC(hwnd);
        // Altes Bild löschen
        GetClientRect(hwnd, &rect);
        FillRect(hdc, &rect, CreateSolidBrush(RGB(255,255,255)));
        DeleteObject(CreateSolidBrush(RGB(255,255,255)));
        // Neues Bild zeichnen
        SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(0, 0, 0)));
        MoveToEx(hdc, Spieler.x, Spieler.y-10, NULL);
        LineTo(hdc, Spieler.x, Spieler.y+10);
        MoveToEx(hdc, Spieler.x-10, Spieler.y, NULL);
        LineTo(hdc, Spieler.x+10, Spieler.y);
        DeleteObject(CreatePen(PS_SOLID, 1, RGB(100, 100, 100)));
        ReleaseDC(hwnd, hdc);
    } // Hauptspielschleife

    // Spiel beenden

    return message.wParam;
}

______________________________________________________________________
Zurück