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
-
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.