• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

mini mini mini game in C

BDG

Mitglied
Hallo Leute ... ich bin totaler anfänger in c ... ich wollte mal eben aus einem Buch ein Spiel nachmachen aber das funktioniert nicht ... so siehts aus :

Code:
HDC hdc;
int xmax, ymax;
int xaball, yball;
int r =15;
int dx=5;
int dy=5;
else if (m == WM_KEYDOWN) {
if (wParam == VK_LEFT) xball -= dx;
else if (wParam == VK_RIGHT) xball += dx;
else if (wParam == VK_UP) yball -= dy;
else if (wParam == VK_DOWN) yball += dy;
else if (wParam == VK_SPACE)
Rectangle(hdc, -1, -1, xmax+1,ymax+1);
}
else if  (m == WM_PAINT) {
     Ellipse(hdc, xball-r, yball-r, xball+r, yball+r
     ValidateRect(hwnd, 0);
     }

Und hier falls das unbedingt nötig is nochmal der ganz ganze code :

Code:
#include <windows.h>
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
HDC hdc;
int xmax, ymax;
int xaball, yball;
int r =15;
int dx=5;
int dy=5;
else if (m == WM_KEYDOWN) {
if (wParam == VK_LEFT) xball -= dx;
else if (wParam == VK_RIGHT) xball += dx;
else if (wParam == VK_UP) yball -= dy;
else if (wParam == VK_DOWN) yball += dy;
else if (wParam == VK_SPACE)
Rectangle(hdc, -1, -1, xmax+1,ymax+1);
}
else if  (m == WM_PAINT) {
     Ellipse(hdc, xball-r, yball-r, xball+r, yball+r
     ValidateRect(hwnd, 0);
     }

Was hab ich Falsch gemacht ?
 
Werbung:
Code:
int dy=5;[FONT=monospace]
[/FONT][B][COLOR=darkred]else[/COLOR][/B] if (m == WM_KEYDOWN) {

Was macht das else da??
 
Der Code, der ausgeführt werden soll, muss immer in die Prozedur des jeweiligen Fensters, in diesem Fall dem hwnd
Code:
switch(message)
{
    /*...*/
    case WM_KEYDOWN: 
    {
        if (wParam != VK_LEFT && wParam != VK_RIGHT && 
            wParam != VK_UP && wParam != VK_DOWN && wParam != VK_SPACE) 
        { 
            break; 

        }


         switch (wParam) 
        {
           case VK_LEFT:
              /*...*/ break;
           case VK_RIGHT:
             /*...*/ break;
          //etc.
         }
    }
}
 
Zuletzt bearbeitet:
Werbung:
Außerdem fehlt in der Windowprozedur:
Code:
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
Du solltest auch darauf achten, dass eine MessageBox ausgegeben wird, wenn ein Fehler passiert ist:

Nach der Registrierung des Fensters:
Code:
    if (!RegisterClassEx (&wincl))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
und nach der Erstellung des Fensters:
Code:
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

Die Message Loop sieht so aus:
Code:
while (GetMessage (&messages, NULL, 0, 0) > 0)
Wichtig ist, dass nicht nur überprüft wird, ob es nicht 0 ist, sondern auch überprüft wird, ob es eine positive Zahl ist
 
Zuletzt bearbeitet:
Sorry, aber ich habe noch einen Fehler gefunden

Code:
        case WM_PAINT:
        {
             hdc = BeginPaint (hwnd, &ps);  //zeichnen starten
             Ellipse(hdc, xball-r, yball-r, xball+r, yball+r);
             ValidateRect(hwnd, 0);
             EndPaint (hwnd, &ps);  //zeichnen beenden
        }
Dafür ist als globale Variable
Code:
PAINTSTRUCT ps;
nötig
 
lol 3 posts :) ... nurleider weiß ich nicht wie ich dasjetzt in eine frienfolge krigen soll ... wie schon gesagt die sprache C ist mir erst gestern zum ersten mal begegnet ...
 
Werbung:
ja ok vlt. war das etwas übertrieben aber ich kann jetzt auf jeden fall etwas beser c als im november ... da wusste ich nur wie ich printf mache mehr wusste ich da nicht ...
 
Der gesamte Code (ungetestet; veränderungen rot hervorgehoben):
Code:
#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);


//globale Variablen
char szClassName[ ] = "WindowsApp";

[COLOR=darkred]HDC hdc;
PAINTSTRUCT ps;

int xmax, ymax;[/COLOR] [COLOR=darkred]
int xball, yball;
int r =15;
int dx=5;
int dy=5;[/COLOR]


int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/*Wenn was schief gelaufen ist, Fehlermeldung*/
    if (!RegisterClassEx (&wincl))
    {
[COLOR=darkred]        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);[/COLOR]
        return 0;
    }


    hwnd = CreateWindowEx (
           0,
           szClassName,
           "Windows App",
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           544,
           375,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );

[COLOR=darkred]/* Wenn was schief gelaufen Fehlermeldung */
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }[/COLOR]

    ShowWindow (hwnd, nFunsterStil); //Fenster zeigen
    UpdateWindow(hwnd);

/*Message Loop*/
    while (GetMessage (&messages, NULL, 0, 0)[COLOR=darkred] > 0[/COLOR])
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
}

/* window procedur */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
[COLOR=darkred]        case WM_CLOSE:      //Beim schließen des Fensters
            DestroyWindow(hwnd);
            break;[/COLOR]
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
            
        [COLOR=darkred]case WM_KEYDOWN:  //bei Tastendruck
        {
             switch(wParam)
             {
                case VK_LEFT:
                      xball-=dx;
                      break;
                case VK_RIGHT:
                      xball +=dx;
                      break;
                case VK_UP:
                      yball -= dy;
                      break;
                case VK_DOWN:
                      yball += dy;
                      break;
                case VK_SPACE:
                      Rectangle(hdc, -1, -1, xmax+1, ymax+1);
                      break;
             }
        }
        case WM_PAINT:  //Zeichnen
        {
             hdc = BeginPaint (hwnd, &ps);  //Zeichen starten
             Ellipse(hdc, xball-r, yball-r, xball+r, yball+r);
             ValidateRect(hwnd, 0);
             EndPaint (hwnd, &ps);  //Zeichnen beenden
        }[/COLOR]
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
 
Zuletzt bearbeitet:
Werbung:
is das jetzt c oder c++ ? weil bei mir funkt das nich ... und ich hab das als konsole anwendung in c gemacht ...
 
is das jetzt c oder c++ ?
Ich hab mit c++ noch keine WinApis geschrieben, ich weiß dager auch nicht wie ein WinApi Quellcode in c++ aussieht. Aber ich kann dir sagen, dass es vom c-Syntax her richtig ist
und ich hab das als konsole anwendung in c gemacht ...
Es ist aber keine Konsolenanwendung, sondern eine WinApi

kommt bei beiden (c/c++) der gleiche error ... das mit dem
ellipse@20
und dem anderen dingens was ich nich buchstabieren kann ...
schick mal die gesamte Fehlermeldung
 
Werbung:
ok als win api ins c kommen nun keine errors aber da is oben ganz links ganz oben in der ecke ein teil vom ball zu sehen aber man kann ihn nicht bewegen oder sonstiges ...
 
in die cases von VK_LEFT etc. noch einfügen:
Code:
ReleaseDC(hwnd, hdc);
Und
Code:
[COLOR=black]hdc = BeginPaint (hwnd, &ps);[/COLOR]
zu
Code:
hdc = GetDC(hwnd);
ändern


dann brauchst du auch nicht mehr die PAINTSTRUCT und
Code:
[COLOR=black]EndPaint (hwnd, &ps);[/COLOR]
fällt ebenfalls weg
 
Zuletzt bearbeitet:
Code:
        case WM_KEYDOWN:  //bei Tastendruck
        {
             switch(wParam)
             {
                case VK_LEFT:
                      xball-=dx;
                      ReleaseDC(hwnd, hdc);
                      break;
                case VK_RIGHT:
                      xball +=dx;
                      ReleaseDC(hwnd, hdc);
                      break;
                case VK_UP:
                      yball -= dy;
                      ReleaseDC(hwnd, hdc);
                      break;
                case VK_DOWN:
                      yball += dy;
                      ReleaseDC(hwnd, hdc);
                      break;
                case VK_SPACE:
                      Rectangle(hdc, -1, -1, xmax+1, ymax+1);
                      ReleaseDC(hwnd, hdc);
                      break;
             }
        }

nope is immer noch gleich ...
 
Werbung:
DAchte ich hätte meinen Beitrag rehctzeitig bearbeitet, war dann doch zu spät

alogheo schrieb:
Code:
[COLOR=black]hdc = BeginPaint (hwnd, &ps);[/COLOR]
zu
Code:
hdc = GetDC(hwnd);
ändern

dann brauchst du auch nicht mehr die PAINTSTRUCT und
Code:
[COLOR=black]EndPaint (hwnd, &ps);[/COLOR]
fällt ebenfalls weg
 
juhu thx es funktioniert :)
aber kann man auch die geschwindigkeit ändern ohne das die pixel abstände mehr werden ?
Und was bringt mir die Leertaste ? da passiert ja nichts ...
 
Werbung:
ne ich mein ja nur ...

case VK_SPACE:
Rectangle(hdc, -1, -1, xmax+1, ymax+1);
ReleaseDC(hwnd, hdc);
break;
 
Zurück
Oben