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

mini mini mini game in C

Mir ist grad ne einfachere Variante eingefallen:
Code:
_sleep(/*millisekunden*/);
Auch mit in die cases VK_LEFT etc.
 
Werbung:
cool thx :=)
und jetzt versuch ich mal das man davor och angeben kann wie gro´ß und schnell der sein soll :)
 
tja wer hätte das gedacht : es funktiioniert nicht :(
Hier mal mein code :

Code:
#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
//globale Variablen
char szClassName[ ] = "WindowsApp";
HDC hdc;
PAINTSTRUCT ps;
int xmax, ymax; 
int xball, yball;
int r =$a;
int dx=$c;
int dy=$c;
int a, b, c;
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))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
 
    hwnd = CreateWindowEx (
           0,
           szClassName,
           "Windows App",
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           544,
           375,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );
/* Wenn was schief gelaufen Fehlermeldung */
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    ShowWindow (hwnd, nFunsterStil); //Fenster zeigen
    UpdateWindow(hwnd);
/*Message Loop*/
    while (GetMessage (&messages, NULL, 0, 0) > 0)
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
}
/* window procedur */
printf("Wie groß soll der Ball sein ?   ");
sanf("%d",$a);
printf("Schnell soll sich der Ball bewegen (0 ist am schnellsten)  ");
sanf("%d",$b);
printf("Wie viel abstand soll zwischen ball A und B sein ?   ");
sanf("%d",$c);
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CLOSE:      //Beim schließen des Fensters
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage ();       /* send a WM_QUIT to the message queue */
            break;
 
        case WM_KEYDOWN:  //bei Tastendruck
        {
             switch(wParam)
             {
                case VK_LEFT:
                      xball-=dx;
                      _sleep($b);
                      break;
                case VK_RIGHT:
                      xball +=dx;
                      _sleep($b);
                      break;
                case VK_UP:
                      yball -= dy;
                      _sleep($b);
                      break;
                case VK_DOWN:
                      yball += dy;
                      _sleep($b);
                      break;
                case VK_SPACE:
                      Rectangle(hdc, -1, -1, xmax+1, ymax+1);
                      break;
             }
        }
        case WM_PAINT:  //Zeichnen
        {
             hdc = GetDC(hwnd);  //Zeichen starten
             Ellipse(hdc, xball-r, yball-r, xball+r, yball+r);
             ValidateRect(hwnd, 0);
 
        }
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

Im Grunde genommen wusste ich ja schon worher das es nicht funktionieren wird aber ... ich meine ich will ja nicht das alogheo alles macht ... :=) sonst kann ich ja am ende garnicht mehr sagen : guckmal ich hab ein spiel programmiert ;)
I hope you can help me
 
Zuletzt bearbeitet:
Werbung:
Merke WinApi != Konsolenanwendung. Heißt du kannst in einem Fenster nichts mit printf ausgeben und scanf einlesen.
Und du hast schon wieder Code außerhalb der WinMain und außerhalb der WindowsProcedure geschrieben.
Um dir zu verdeutlichen, was du machst, wenn du alles außerhalb der WindowsProcedur/WinMain schreibst, ist das das selbe wie wenn du das schreibst:
Code:
#include <stdio.h>
int main(void)
{ return 0; }
printf("Hello World"); //Das wird nie ausgegeben
So kannst du Text in das Fenster schreiben.
Code:
    char string[]="Test";
    hdc = BeginPaint(hwnd, &ps);
    TextOut(hdc, 0, 0, string, sizeof(string)-1);
    EndPaint(hwnd, &ps);
Wie du Eingabefelder erstellst kann ich nicht erklären, aber vlt. hilft dir das weiter: WinAPI - (17.) Editboxen erstellen und benutzen

Und denk dran, alles in eine Prozedur rein.
 
geht das vlt. wenn ich von einer kosonlenanwendung zu winapi übergehe ? oder das game in ner konsolenanwendung irgendwie zum laufen bekomme ?
 
Du könntest das ganze als Konsolenanwendung compilen, was aber nur funzt, wenn du keine Zeichenfunktionen verwendest (was bei diesem Spiel aber nötig ist).
Oder du machst das ganze in einer c++ Konslenanwendung (mit ein paar absolut positionierten Punkten)(müsste mich aber erstmal wieder in c++ reinlesen, um dir dabei helfen zu können).
 
Werbung:
hmm mit den angaben oben kann ich leider garnichts anfangen :) aber naja dann kann man halt nich größe usw. einstellen ... is ja auch nich so wichtig ...
 
hmmm ... wie kann ich das nun machen das anstatt ein kreis ein bild (von mir gemalt (transparentes png/gif)) das soeins dann als figur da is ?
 
Werbung:
und gleich darauf noch ne frage ... ich will jetzt das der bomben werfen kann (ja ich bin frortgeschritten :) )
und da hat ich die idee das wenn man leertaste drückt das dann neuer kreis gezeichnet wird und dann runterfällt ... so sieht das bei mir aus :

Code:
                case VK_SPACE:
                      hdc = GetDC(hwnd);  //Zeichen starten
             Ellipse(hdc, xbomb-i, ybomb-i, xbomb+i, ybomb+i);
             ValidateRect(hwnd, 100);
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
             ybomb += dy1;
                      break;

so hmm also die kreise werden erzeugt nur 2 probleme sind dabei :
sie werden an der falschen stelle erzeugt -- sie solleb vor der figut erzeugt werden
und sie fallen nicht sondern gehen bei jeder leertaste mehr runter ... wie kann ich das machen ?^^

PS: der link hat mir nich viel weitergeholfen ... (trotzdem THX) weil da is alles english und aus den codes da bin ich nicht schlauer geworden .. ich hab nicht gesehen das man irgendwo die pfadangaben vom bild eintragen kann ...
 
BDG schrieb:
.. ich hab nicht gesehen das man irgendwo die pfadangaben vom bild eintragen kann ...

Du musst dem Ball eine id zuweisen (am besten in einer resource.h)
Code:
#define IDB_BALL 2001
Muss dann natürlich in der main.c inkludiert werden

Und den Pfad gibst du in einer Resource-Datei an
resource.rc:
Code:
#include <windows.h>
#include "resource.h"

IDB_BALL BITMAP "ball.bmp"

Zu dem Problem mit dem Bomben poste ich dann später noch was
 
Werbung:
hmm und was is nun mit den bomben werfen ? das die runterfallen ?
PS: das mit dem Bilder laden hab ich immernoch nich verstanden ... und ich hab auch noch gegooglet ... aber ich kapier das nich ... sry
 
Zuletzt bearbeitet:
hmm und was is nun mit den bomben werfen ? das die runterfallen ?
PS: das mit dem Bilder laden hab ich immernoch nich verstanden ... und ich hab auch noch gegooglet ... aber ich kapier das nich ... sry
Kenne mich zwar nur ein ganz kleines bisschen mit C aus, aber ich glaube das Zitat beantwortet deine Frage am besten:
(vlt. doch nochmal c-grundlagen lernen?)
 
Werbung:
Ich könnte jetzt versuchen, dir das zu erklären, aber du würdest nur die Hälfte verstehen, weil dir die Grundlagen fehlen.

Bei der Sache mit den Bomben, habe ich selbst gerade ein Problem, Antwort kommt wahrscheinlich erst morgen
(Fress jetzt und muss dann noch Hausaufgaben machen)
 
(Fress jetzt und muss dann noch Hausaufgaben machen)
xD das heist : jetzt esse ich und dann muss ich noch Hausaufgaben machen

PS: bist du gymi ? oder real ? von meim freund der bruder is 15 und geht schon zur arbeit und hat keine schule mehr ... (ich gimy sein tun und nun simpsons gucken)
 
ich tu haben fertig schreiben gemacht das Code
Code:
               case VK_SPACE:
                      shootBomb(hwnd);
                      ReleaseDC(hwnd, hdc);
                      break;
und die shootBomb funktinion:
Code:
void shootBomb(HWND hwnd)
{
   hdc = GetDC(hwnd);
   RECT rcClient;
   GetClientRect(hwnd, &rcClient); //Fenstergeometrie von hwnd
   int i=0;
   while(yball+r2+i<rcClient.bottom)  //solange der Boden nicht erreicht wurde
   {
     Ellipse(hdc, xball-r2, yball-r2+i, xball+r2, yball+r2+i); //r2 = radius der Bombe
     _sleep(10);
     i+=10;
   }
}
PS: gymi (und ich steh in mathe nicht, wie du, auf 4 (sondern auf 1 :p))
 
Werbung:
Zurück
Oben