Anzahl Sprites



  • Hallo,
    Also ich programmiere ein Blocks-Variante.
    Allerdings habe ich jetzt das Problem, dass ich keine Sprites mehr anlegen kann.
    Gibt es eine bestimmte Anzahl an Oberflächen, die man anlegen kann?
    Wenn ja weiß jemand, wie man das umgehen kann?



  • Original erstellt von <Andi>:
    Gibt es eine bestimmte Anzahl an Oberflächen, die man anlegen kann?

    AFAIK nicht. (Was is Blocks und warum brauch das so viele Surfaces?!)



  • welche Api ???
    Falls es direkt Sprites in D3D geben sollte und die begrenzt sind, warum bastelst du dir die net einfach selber, is doch nur nen Viereck mit Textur



  • @TGGC:

    Blocks dürfte sowas wie Breakout sein. Wo Du mit dem Ball und dem steuerbaren Paddel die Blöcke wegholzen mußt...



  • Soviel ich weiß wird die Anzahl der möglichen Surfaces ja nur vom Speicher der Grafikkarte oder vom Arbeitsspeicher begrenzt. Zumindest bei DirectDraw und sicherlich auch bei Direct3D. Ich frag mich nur welche Art von Oberflächen du meinst, weil du nicht geschrieben hast, ob du in C++ mit DirectDraw programmierst oder was sonst. Also ich kann mir nicht vorstellen, dass dir für eine Blocks-Variante die Oberflächen ausgehen, soviele kann man da ja nicht brauchen.



  • Tja auf jeden fall erstelle ich die Oberflächen mit DirectDraw.
    Und es stimmt auch, dass Blocks so was wie Breakout ist.
    Na ja ich dachte auch, dass einem eigentlich die Oberflächen nicht ausgehen können, aber wenn ich jetzt noch weitere Sprites anlegen will (Für jedes Sprite erstelle ich eine eigene Oberfläche) dann kommt kein Syntax bzw. Linker Fehler aber wenn ich das Programm dann starte, dann geht nichts mehr.
    Hier die Create-Funktion:

    void Sprite::Create(DDClass* DDraw, char* Filename, int frmWidth, int frmHeight, 
                        int frmX, int frmY)
    {
        lpDDSpriteSurface = DDraw->CreateSurfaceFromBitmap(Filename, frmWidth*frmX, frmHeight*frmY);
    
        FrameWidth  = frmWidth;   //neu
        FrameHeight = frmHeight;  //neu
    
        DDSURFACEDESC2 SurfaceDesc;
        ZeroMemory(&SurfaceDesc,sizeof(SurfaceDesc));
        SurfaceDesc.dwSize = sizeof(SurfaceDesc);
    
        lpDDSpriteSurface->GetSurfaceDesc(&SurfaceDesc);
    
        FramesX = frmX;
        FramesY = frmY;
    
        SpriteWidth  = SurfaceDesc.dwWidth;
        SpriteHeight = SurfaceDesc.dwHeight;
    
        // schwarze Bereiche sollen nicht kopiert werden
        DDCOLORKEY ColorKey;
        ColorKey.dwColorSpaceLowValue = 0;
        ColorKey.dwColorSpaceHighValue = 0;
    
        lpDDSpriteSurface->SetColorKey(DDCKEY_SRCBLT,&ColorKey);
    }
    
    void Sprite::Drawhin(LPDIRECTDRAWSURFACE7 lpDDSurface)
    {
        RECT SRect;
    
        SRect.left   = (CurrentFrame%FramesX) * FrameWidth;
        SRect.right  = SRect.left + FrameWidth;
        SRect.top    = (int(CurrentFrame/FramesX)) * FrameHeight;
        SRect.bottom = SRect.top + FrameHeight;
    
        if(SRect.bottom > FramesY * FrameHeight)
        {
            SRect.bottom = FramesY * FrameHeight;
            SRect.left   = (FramesX-1) * FrameWidth;
            SRect.right  = SRect.left + FrameWidth;
            SRect.top    = SRect.bottom - FrameHeight;
            CurrentFrame = FramesX * FramesY;
        }
        else {
            CurrentFrame++;
        }
        lpDDSurface->BltFast(x,y,lpDDSpriteSurface,&SRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
    }
    

    Und hier die CreateSurfaceFromBitmap:

    LPDIRECTDRAWSURFACE7 DDClass::CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight)
    {
        // Device Context für das Bild und die DirectDraw-Oberfläche anlegen
        HDC hBmDC,hSurfDC;
    
        // Handle der zu ladenden Bitmap
        HBITMAP hBM;                    
    
        // Oberflächenbeschreibung
        DDSURFACEDESC2 SurfDesc;  
    
        // Zeiger auf die Oberfläche
        LPDIRECTDRAWSURFACE7 lpDDSurface;   
    
        // Bild laden
        // wenn 0 übergeben wurde, wird die tatsächliche Höhe verwendet
        hBM = (HBITMAP)LoadImage(NULL,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
    
        // testen ob ein Fehler während des Ladens aufgetreten ist
        if(NULL == hBM)
        {
            return 0;
        }
    
        BITMAP Bitmap;
        GetObject(hBM,sizeof(BITMAP),&Bitmap);
    
        // Oberflächenbeschreibung initialisieren
        ZeroMemory(&SurfDesc, sizeof(SurfDesc));
        SurfDesc.dwSize = sizeof(SurfDesc);
    
        // Caps, Höhe und Breite sollen berücksichtigt werden
        SurfDesc.dwFlags =  DDSD_CAPS   | DDSD_HEIGHT | DDSD_WIDTH;
    
        SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
        SurfDesc.dwWidth  = Bitmap.bmWidth;
        SurfDesc.dwHeight = Bitmap.bmHeight;
    
        // Oberfläche anlegen
        if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
        {
            return 0;
        }
    
        // Device Context der Oberfläche holen
        lpDDSurface->GetDC(&hSurfDC); 
    
        // Compatiblen Device Context für das Bild anlegen
        hBmDC = CreateCompatibleDC(hSurfDC);
    
        // Bild in den Device Context holen
        SelectObject(hBmDC,hBM);
    
        // Bild in die Oberfläche kopieren
        BitBlt(hSurfDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hBmDC,0,0,SRCCOPY);
    
        // Device Context freigeben
        lpDDSurface->ReleaseDC(hSurfDC);
    
        // Device Context und Bild löschen
        DeleteDC(hBmDC);
        DeleteObject(hBM);
    
        // Zeiger auf die Oberfläche zurückgeben
        return lpDDSurface;
    }
    

    Ich hoffe irgendjeman kann mir sagen, wie ich mein Problem lösen kann.



  • Original erstellt von <Andi>:
    wenn ich das Programm dann starte, dann geht nichts mehr.

    Definier das mal genau.



  • Na ja wie soll ich das genau definieren?
    ich starte das Programm nach dem Übersetzen mit F5,
    dann kommt dieser Windows-Fehlerton und dann läuft nichts mehr weiter.
    Ich kann dann nur nocht mit Shift-F5 den Debugmodus verlassen.



  • Kommt wirklich nur der Fehlerton? Keine Message-Box? Oder vielleicht siehst Du sie nicht, weil Du im Vollbildmodus arbeitest. Stell Dein Programm mal auf Fenstermodus um.



  • Original erstellt von <Andi>:
    Na ja wie soll ich das genau definieren?

    Indem du rausfindest an welcher Stelle dein Programm abkackt, z.b. mit Debugger oder Logger.


Anmelden zum Antworten