2 Fragen



  • zu 1:
    Jo stimmt da war wirklich was falsch. so muss das aussehen:

    do 
     { 
              chr=getch();   
                switch(chr) 
                { 
                //links 
                case 75:{                             
                    setposition(-3,0);    
                        break;}    
                //rechts 
                case 77:{        
                    setposition(+3,0); 
                        break;}        
                //unten 
                case 72:{ 
                    setposition(0,-3); 
                        break;} 
                //oben 
                case 119:{   
                    setposition(0,+3); 
                        break;} 
                }          
        }while(true);
    

    zu 2: werd ich mal versuchen!

    MfG
    Canon



  • ich hab diesen quelltext hier gefunden und versucht ihn gleich zu verwenden weil ich auf der suche nach genau so einem quelltext für mein kleines spielchen war.

    nun mein problem:

    wenn ich mein programm in vc++ ausprobier läuft alles einwandfrei, wenn ich aber die execute-datei ausführe dann seh ich das bild nichtmehr. kann mir jemand helfen das problem zu beheben?

    P.S. hab win2000 wenn relevant



  • hat sich erledigt, vergessen die bitmap ins verzeichnis von der exe reinzuschmeisen...



  • hallo nochmal,

    ich hab trotzdem nochmal ne frage bezüglich des Quelltextes, so wie ich das sehe läd man hier die bilder jedesmal neu oder? gibts nicht ne möglichkeit das bild einmal zu laden und dann so zu verwenden?

    der hintergund:

    ich hab vor ca. 1 woche begonnen ein kleines weltraumspielchen zu basteln. das raumschiff fliegt auch schon so wie ich will(is ja nicht immer so 🙂 ), heute hab ich noch asteroiden eingefügt. ich hab in meiner schleife nen count drin mit dem ich den speed der asteroiden und des raumschiff steuer und den ich mir auch anzeigen lasse. je nachdem wieviel ich das raumschiff bewege, hört das programm bei einem countstand zwischen 45000 und 80000 auf die bilder hochzuladen (glaub ich jedenfalls weil er sie nichtmehr anzeigt).

    kann mir jemand helfen?

    danke schonmal im vorraus



  • Das Problem kenn ich..
    Du hast recht, das Bild wird jedes mal neu geladen und somit ist der Speicher irgendwann 'voll' und es kann nicht mehr bewegt werden, da es dann ja neu geladen werden müsste..
    Aber ich hab leider auch keine Ahnung wie man das Problem beheben könnte.



  • naja wenigstens steh ich mit dem problem nicht alleine da. es wäre schön wenn sich uns einer annehmen würde 🙂 🙂

    ich komme ansonsten mit meinem programm einfach nicht weiter bzw. bringt es auch gar nichts weiter zu programmieren wenn ich noch keine antwort habe 😞



  • Die Konsole ist nicht dafür ausgelegt Weltraumshooter zu basteln :), schau dir dazu mal eine Library wie Allegro (Siehe Spiele/Grafik-FAQ an). Mit Hilfe dieser kannst du a) einfacher und b) ohne Probleme Bitmaps in der Konsole anzeigen lassen 🙂

    MfG SideWinder



  • Naja gut hier mal meine (auf Anfrage quasi) geistigen Ergüsse:

    // Bmp2Console.cpp : Defines the entry point for the console application.
    //
    
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h> 
    #include <conio.h> 
    
    void LoadBmp(char *szBitmap, HWND aWindow, BITMAP* aBitmap, HBITMAP* aBitmapHandle, HDC* aBitmapDC)
    {
        if (::IsWindow(aWindow) == 0)
        {
            throw "The specified window handle is invalid.";
        }
    
        // Load image
        *aBitmapHandle = (HBITMAP)LoadImageA(NULL,szBitmap, IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
        if (!*aBitmapHandle)
        {
            throw "Failed to load image.";
        }
    
        if (::GetObjectA(*aBitmapHandle, sizeof(*aBitmap), aBitmap) == 0)
        {
            throw "Failed to GetObject";
        }
    
        HDC aDestinationDC = ::GetDC(aWindow);
        if (aDestinationDC == NULL)
        {
            throw "DC for window is invalid.";
        }
    
        *aBitmapDC = ::CreateCompatibleDC(aDestinationDC);
        if (*aBitmapDC == NULL)
        {
            throw "Failed to CreateCompatibleDC.";
        }
    }
    
    void PaintBitmap(HDC aDestDC, BITMAP aBitmap, HBITMAP aBitmapHandle, HDC aBitmapDC, int PosX, int PosY, int aDestWidth, int aDestHeight)
    {
        // select the bitmap
        ::SelectObject(aBitmapDC, aBitmapHandle);
    
        // if same size use BitBlt
        if ((aBitmap.bmWidth == aDestWidth) &&
            (aBitmap.bmHeight == aDestHeight))
        {
            ::BitBlt( aDestDC,
                      PosX,
                      PosY,
                      aDestWidth,
                      aDestHeight,
                      aBitmapDC,
                      0,
                      0,
                      SRCCOPY );
        }
        // else stretch/shrink
        else
        {
            ::StretchBlt( aDestDC,
                          PosX,
                          PosY,
                          aDestWidth,
                          aDestHeight,
                          aBitmapDC,
                          0,
                          0,
                          aBitmap.bmWidth,
                          aBitmap.bmHeight,
                          SRCCOPY);
        }	
    }
    
    void InvalidateOldRegion(HWND aWindow, int myPosX, int myPosY, int Width, int Height)
    {
        RECT myInvalidateRect;
    
        myInvalidateRect.left = myPosX;
        myInvalidateRect.right = myPosX + Width;
        myInvalidateRect.top = myPosY;
        myInvalidateRect.bottom = myPosY + Height;
    
        InvalidateRect( aWindow, &myInvalidateRect, true );
    }
    
    int main ()
    { 
        // Set console title
        ::SetConsoleTitleA("MyWindow");
    
        HWND myWindow = ::FindWindowA("ConsoleWindowClass","MyWindow"); 
        if (myWindow == NULL)
        {
            printf("Failed to get window handle.\r\n");
            return 1;
        }
    
        // get the window DC and it's size
        HDC			myWindowDC = ::GetDC( myWindow );
        RECT		myWindowDimensions;
        ::GetClientRect( myWindow, &myWindowDimensions);
        int myWindowWidth  = myWindowDimensions.right - myWindowDimensions.left;
        int myWindowHeight = myWindowDimensions.bottom - myWindowDimensions.top;	
    
        HBITMAP		myBitmapHandle;
        HDC			myBitmapDC;
        BITMAP      myBitmap;
        LoadBmp("Bild.bmp", myWindow, &myBitmap, &myBitmapHandle, &myBitmapDC);
    
        int myPosX = 0;
        int myPosY = 0;
        int myDestWidth  = myBitmap.bmWidth;
        int myDestHeight = myBitmap.bmHeight;
        const int myStepWidthX = 10;
        const int myStepWidthY = 10;
    
        for (int i = 0; i < 25; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                printf("- This is just some text --");
            }
            printf("\r\n");
        }
        unsigned char chr; 
        while (true)
        { 
            chr = _getch();		
            switch ( chr ) 
            { 
                // left
                case 75:
                    InvalidateOldRegion(myWindow, myPosX, myPosY, myDestWidth, myDestHeight);
                    myPosX = (myPosX <= myStepWidthX) ? 0 : (myPosX - myStepWidthX);
                    PaintBitmap(myWindowDC, myBitmap, myBitmapHandle, myBitmapDC, myPosX, myPosY, myDestWidth, myDestHeight );				
                    break;
    
                // right
                case 77:
                    InvalidateOldRegion(myWindow, myPosX, myPosY, myDestWidth, myDestHeight);
                    // do not move bitmap outside of the window
                    if (myPosX + myStepWidthX >= (myWindowWidth - myDestWidth))
                    {
                        myPosX = myWindowWidth - myDestWidth;
                    }
                    else
                    {
                        myPosX += myStepWidthX;
                    }
                    PaintBitmap(myWindowDC, myBitmap, myBitmapHandle, myBitmapDC, myPosX, myPosY, myDestWidth, myDestHeight );
                    break;
    
                // down
                case 80:				
                    InvalidateOldRegion(myWindow, myPosX, myPosY, myDestWidth, myDestHeight);
                    if (myPosY + myStepWidthY >= (myWindowHeight - myDestHeight))
                    {
                        myPosY = myWindowHeight - myDestHeight;
                    }
                    else
                    {
                        myPosY += myStepWidthY;
                    }
                    PaintBitmap(myWindowDC, myBitmap, myBitmapHandle, myBitmapDC, myPosX, myPosY, myDestWidth, myDestHeight );
                    break;
    
                // up
                case 72:
                    InvalidateOldRegion(myWindow, myPosX, myPosY, myDestWidth, myDestHeight);
                    myPosY = (myPosY <= myStepWidthY) ? 0 : (myPosY - myStepWidthY);
                    PaintBitmap(myWindowDC, myBitmap, myBitmapHandle, myBitmapDC, myPosX, myPosY, myDestWidth, myDestHeight );
                    break;
            }		
        }
    
        ::DeleteObject( myBitmapHandle );
        ::ReleaseDC( myWindow, myBitmapDC );
        ::ReleaseDC( myWindow, myWindowDC );
    }
    

    Bild kann man nimmer ausm Screen schieben und altes Bild wird gelöscht vorher (=> keine Schlieren).

    Problem scheint dass man net so easy an die MessageQueue von der Console kommt.
    Per PeekMessage() eine erstelln und GetMessage() in nem extra Thread tut sich jedenfalls nix.
    Hook hat auch irgendwie nix gebracht so aufn ersten Blick.

    Evtl. sollte man noch ENABLE_WINDOW_INPUT setzten damit man mitbekommt wenn sich die Fenstergröße oder so ändert.
    Kein Schimmer ob des taugt.

    MfG



  • So... und was soll das jetzt?
    Console ist halt Console und Windows ist halt Windows...



  • Desswegen nennt man's oft auch Console-Window :p

    Was der Sinn davon is musste den fragen der den Thread aufgemacht hat 😉


Anmelden zum Antworten