breakout in Winapi mit GDI und c++



  • Wenn ich nun soweit bin, wie weiter.

    ich dachte erst mal die bewegung des Balles.. aber dazu brauch ich die kolison.. aber dafür brauch ich einen Ball der sich bewegt...

    hmmm... ok vieleicht einfach mal den ball wie wild vom rand abprallen lasse.

    Nun stellt sich die Frage, wie ich den Ball schräg über den Bildschirm bewegen könnte.
    Mit einer Schleife??

    So,
    if(i < 200)
    Ball zeichnen, x+1 y+1

    hmm. das wäre dann mit einem winkel von 45Grad, und ein murks.

    Vektor??
    mit Sinus winkel berechnen?? oh gott wie geht denndas in diesem Fall??

    naja, vieleicht kann mich ja jemand aufklären.

    EDIT:

    @Sgt. Nukem

    nunja, dann müsst ich sie ja ausserhalb eines jeden blockes definieren(dekla)

    aber eine statische variable hat doch auch die globale eingenschaft, nicht?
    also ich meine der wert wird nicht immer gelöscht, wenn man ausserhalb des blockes kommt



  • ethereal schrieb:

    also ich glaub so zehn level, ja müsste eigentlich hinkommen.

    10? Ist ja gar nix! Alles unter 100 ist Schrott. 😉



  • mach nun damit weiter, dass ich verhindere das der schläger aus dem Bild fährt.

    void schlaeger:: mDraw(HDC hdc, LPARAM lParam) 
    { 
    	y = 650; 
        x = mousko(lParam); 
    	xt = x + 90; 
        yt = 670; 
        if(xt < 1024)
    	{
    		Rectangle(hdc, x, y, xt, yt); 
    	}
    	else
    	{
    		x--;
    		xt = x + 90;
    		Rectangle(hdc, x, y, xt, yt);
    	}
    }
    

    klappt aber nicht, mir ist nur nicht klar wieso.

    wenn der rechte rand aus dem Fenster hängt wird ein pixelabgezogen und neu gezeichnet....

    Ich scheitere immer an so doofen kleinigkeiten 😞



  • Soll das ein Witz sein? Wenn x= 10000 ist, dann kann x - 1 nie auf dem Bildschirm sein. Denk mal darüber nach!

    Bye, TGGC



  • was??
    woher hast du denn die 10000 ??

    Mein Bildschirm hat eine Horizontale von 1024pixel.
    Also sind 1024 das maixmum meines oberen eckpunktes meines rechteckes.

    also sind alle werte unter 1024+90, oder nicht??

    wie würdest denn du das machen?

    EDIT:

    void schlaeger:: mDraw(HDC hdc, LPARAM lParam) 
    { 
    	y = 650; 
        x = mousko(lParam); 
    	xt = x + 90; 
        yt = 670; 
        if(xt < 1016)
    	{
    		Rectangle(hdc, x, y, xt, yt); 
    	}
    	else
    	{
    		x = 924;
    		xt = 1016;
    		Rectangle(hdc, x, y, xt, yt);
    	}
    }
    

    Es klappt, scheint aber etwas gemurckst.

    Bin ich auf dem richtigen Weg?



  • TGGC schrieb:

    ethereal schrieb:

    also ich glaub so zehn level, ja müsste eigentlich hinkommen.

    10? Ist ja gar nix! Alles unter 100 ist Schrott. 😉

    WIE GEMEIN !!! 😞 😞 😞



  • 10000 ist nur ein Beispiel. Nach dem Code könnte x ja alles sein.

    Wenn du weisst, wie du auf die passenden Zahlen kommst, bist du auf dem richtigen Weg. Sinnvoller ist es aber die Zahl einer Variablen oder Konstanten zuzuweisen und dort die entsprechende Formel hinzuschreiben. Wenn du die Breite des Pads änderst, sollte diese Zahl maximal einmal im Code vorkommen. Genauso die 1024 für die Bildschirmbreite.

    Bye, TGGC



  • hi,
    ich komm nich weiter (mal wieder 🙄)

    Wie mach ich die ballanimation oder die kollision.

    Ich hab Null ideen, hilfe.
    gebt mir bitte einen Gedanken Anstoss



  • Also,
    erst mal was zur Kollision:
    Die einfachste (und oft auch ausreichende) Methode einer Kollisionsabfrage besteht darin, deine Objekt mit einer Bounding-Box zu umgeben. Das bedeutet konkret: Du legst einen rechteckigen Bereich um das Objekt, der, wenn das Objekt Rechteckig ist, dieselben Masse haben sollte.

    bool KollisionsTest(void)
    {
        int Ballradius_x  = BallBreite/2;// Radius der BoundingBox vom Ball
        int Ballradius_y  = BallHoehe/2;
    
        int Schlaegerradius_x=SchlaegerBreite/2;/*Radius der BoundingBox vom Schlaeger*/
        int Schlaegerradius_y=SchlaegerHoehe/2;
    
       //Mittelpunkte beider BoundingBoxes 
    
        int BallCenter_x = Ball_x + Ballradius_x;  //Ball_x ist die x-Koord des B.
        int BallCenter_y = Ball_y + int Ballradius_y; // analog die y-Koord. 
    
        int SchlaegerCenter_x = Schlaeger_x + Schlaegerradius_x; 
        int SchlaegerCenter_y = Schlaeger_y + Schlaegerradius_y;
    
        // jetzt den Abstand der beiden Mittelpunkte
        int Abstand_x = abs(SchlaegerCenter_x - BallCenter_x);
        int Abstand_y = abs(SchlaegerCenter_y - BallCenter_y);
    
        // wenn abstand kleiner ist als beide Radien addiert...
       if((Abstand_x < (Ballradius_x + Schlaegerradius_x))&& (Abstand_y < (Ballradius_y + Schlaegerradius_y)))
        {     //...dann liegt eine Kollision vor, also true zurückgeben
                    return TRUE;
        }
    
        //...ansonsten keine Kollision -> false
        return FALSE;
    }
    

    So, hab's jetzt net getestet, aber ich meine, das müsste irgendwie so schon klappen...
    Zur Animation:
    das ganze ist etwas kompliziert und wird wahrscheinlich ordentlich ruckeln, wenn du immer noch versuchst, GDI zu verwenden, aber prinzipiel würd' das so machen:
    du hast eine Bitmap-Datei, in der jeweils in gleicher größe die einzelnen Bilder der Animation gespeichert sind (hintereinander).
    Dann würde ich mir (bei GDI min.)zwei (, wenn nicht sogar mehr, falls das geht und effektiv ist bei GDI - Frage an die experten !) Objekte erstellen, in die du dann immer das jeweils nächste Bild lädst. Ein Objekt (ich weiss nicht so genau wie das heisst, kann sein, dass das objekt ein HBITMAP sein muss, vielleicht auch nur BITMAP, frag mal rum !) wird dann immer angezeigt, während in das nächste jeweils der nächste Animationsschritt geladen wird. dann zeigst du dieses an und lädsts in das erste den nächsten Animationsschritt. Such mal nach Backbuffering oder double buffering etc... da solltest du eigentlich einiges finden, ich bin da auch kein experte.
    Ansonsten erstmal viel Erfolg
    Gruß
    E-the-Real



  • Auf www.zfx.info unter Tutorials gib's ein gutes Tutorial zu dem Thema, sehr ausführlich. Es wird beschrieben wie man ein einfaches Breakout programmiert.



  • @lustig:
    ich rate erstmal von dem tutorial da ab, denn ich weiss nicht, ob man als anfänger damit...

    Move(double elapsed, std::list<CRenderable> &bricks, CPaddle &paddle);
    

    ...was anfangen kann...
    Dazu kommt dynamische speicherallokierung und so'n ganzer kram. brauch man anfangs eigentlich gar nicht. sicher ist dein tip nicht schlecht, aber ich könnt mir vorstellen, dass er erst mal für verwirrung sorgen wird.
    Gruß
    E-the-Real


Anmelden zum Antworten