|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 20.04.2006, 23:23 Titel: DirectDraw + Colorkey |
|
|
Hallo
Ich habe meine Surfaces jetzt mit Colorkey versehen und den Transfertype der BltFast Methode auf DDBLTFAST_SRCCOLORKEY gesetzt. Nun werden meine Surfaces auch Transperent gezeichnet, jedoch habe ich jetzt ein anderes Problem:
Ich überprüfe vor jeden Draw Aufruf ob mein Surface verloren gegangen ist (IsLost()). Wenn ja dann lösche ich es erstelle es nochmal. Das funktioniert aber nur nun nicht mehr. Hier ist mal ein bischen Code:
Die Draw() Methode:
CPP: | BOOL Surface::Draw(int x, int y, LPDIRECTDRAWSURFACE7 Backbuffer, LPDIRECTDRAW7 DDObject, unsigned int Framerate)
{
//berechnung der Rect's usw..
if(!SurfManager->Check(Filename, DDObject))
{
return false;
}
if(FAILED(hr = Backbuffer->BltFast(x, y, SurfManager->GetSurface(Filename), &r, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY)))
{
return false;
}
return true;
} |
Hier die Check() Methode:
CPP: | BOOL SurfaceManager::Check(std::wstring Filename, LPDIRECTDRAW7 DDObject)
{
if(SurfaceMap[Filename]->IsLost() == DDERR_SURFACELOST)
{
DeleteSurface(Filename);
CreateSurface(Filename, NULL, DDObject);
return false;
}
return true;
} |
und hier noch die stark beschnittene CreateSurface() Methode
CPP: | LPDIRECTDRAWSURFACE7 SurfaceManager::CreateSurface(std::wstring Filename, Surface_Info *SurfaceInfo, LPDIRECTDRAW7 DDObject)
{
//Variablen
HBITMAP hBitmap = NULL;
BITMAP Bitmap;
IDirectDrawSurface7 *Surface = NULL;
DDSURFACEDESC2 SurfaceDesc;
HDC destHDC;
HDC srcHDC;
//Bitmap laden
//Alle Member der Struktur mit NULL initialisieren
memset(&SurfaceDesc, NULL, sizeof(SurfaceDesc));
//Alle benötigten Member mit Werten füllen
SurfaceDesc.dwSize = sizeof(SurfaceDesc);
SurfaceDesc.dwWidth = static_cast<int>(Bitmap.bmWidth);
SurfaceDesc.dwHeight = static_cast<int>(Bitmap.bmHeight);
SurfaceDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
SurfaceDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
//Surface erstellen, falls das fehlschlägt NULL zurückgeben
if(FAILED(DDObject->CreateSurface(&SurfaceDesc, &Surface, NULL)))
{
return NULL;
}
//Devicecontext vom Surface holen
Surface->GetDC(&destHDC);
//Devicecontext von der Bitmap holn
srcHDC = CreateCompatibleDC(destHDC);
//Bitmap auf das surface kopieren
//Surface in die Map einfügen
SurfaceMap[Filename] = Surface;
//Das Surface zurückgeben
return Surface;
} |
Wie gesagt sobalt ich das DDBLTFAST_SRCCOLORKEY entferne funktioniert wieder alles. Was mach ich falsch?
Mfg 51m0n _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.04.2006, 00:47 Titel: |
|
|
Was heißt "dass es nicht mehr funktioniert"?
Was passiert, was passiert nicht?
Ohne die Infos können wir dir schlecht helfen _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 21.04.2006, 00:48 Titel: |
|
|
nicht funktioniert = Surface wird nicht mehr angezeigt
Man man man kann heutzutage keiner mehr Hellsehen? _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.04.2006, 02:18 Titel: |
|
|
*lol* nein, sonst würd ich dich ja verstehen
Bist du dir sicher, womit dein Problem wirklich zusammenhängt?
Also ob es jetzt an deiner IsLost()-Prüfung liegt oder am DDBLTFAST_SRCCOLORKEY (oder an etwas ganz anderem)?
Mir sind gleich zwei Sachen aufgefallen...
CPP: | BOOL Surface::Draw(int x, int y, LPDIRECTDRAWSURFACE7 Backbuffer, LPDIRECTDRAW7 DDObject, unsigned int Framerate)
{
//berechnung der Rect's usw..
/**************************************
Woher bekommst du das Filename? Ist nicht als Parameter verzeichnet und kann so eigentlich nur eine globale Variable sein.
Kann es evtl. sein, dass er dadurch bei Check() das Surface in der Map gar nicht finden kann?
**************************************/
if(!SurfManager->Check(Filename,DDObject))
{
return false;
}
if(FAILED(hr = Backbuffer->BltFast(x, y, SurfManager->GetSurface(Filename), &r, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY)))
{
return false;
}
return true;
} |
CPP: | LPDIRECTDRAWSURFACE7 SurfaceManager::CreateSurface(std::wstring Filename, Surface_Info *SurfaceInfo, LPDIRECTDRAW7 DDObject)
{
//Variablen
HBITMAP hBitmap = NULL;
BITMAP Bitmap;
IDirectDrawSurface7 *Surface = NULL;
DDSURFACEDESC2 SurfaceDesc;
HDC destHDC;
HDC srcHDC;
//Bitmap laden
//Alle Member der Struktur mit NULL initialisieren
memset(&SurfaceDesc, NULL, sizeof(SurfaceDesc));
//Alle benötigten Member mit Werten füllen
SurfaceDesc.dwSize = sizeof(SurfaceDesc);
SurfaceDesc.dwWidth = static_cast<int>(Bitmap.bmWidth);
SurfaceDesc.dwHeight = static_cast<int>(Bitmap.bmHeight);
SurfaceDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
SurfaceDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
//Surface erstellen, falls das fehlschlägt NULL zurückgeben
if(FAILED(DDObject->CreateSurface(&SurfaceDesc, &Surface, NULL)))
{
return NULL;
}
/**************************************
1. Wozu?
2. destHDC dürfte schon ungültig sein, da nicht initialisiert
3. Wenn mich nicht alles täuscht, muss man "kompatible" DCs auch freigeben -> ReleaseDC() ;)
**************************************/
//Devicecontext vom Surface holen
Surface->GetDC(&destHDC);
//Devicecontext von der Bitmap holn
srcHDC = CreateCompatibleDC(destHDC);
//Bitmap auf das surface kopieren
//Surface in die Map einfügen
SurfaceMap[Filename] = Surface;
//Das Surface zurückgeben
return Surface;
} |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 21.04.2006, 02:35 Titel: |
|
|
zur ersten anmerkung:
Filename ist der Pfad zur Bilddatei der wird beim erstellen des Surfaces übergeben. Dieser ändert sich auch nich und Check() findet das Surface auch hab ich mit Logfiles getestet.
zur 2. anmerkung:
1.Da wo //Bitmap laden bzw //Bitmap auf das Surface kopieren steht ist normalerweise noch ein brocken code der damit allerdings nichts am hut hat.
2. destHDC wird bei //Bitmap laden initialisiert
3. Beide HDCs werden freigegeben. Einmal mit ReleaseDC() ind einmal mit DeleteDC()
Aber ich denke ich werde doch mit Direct3D weitermachen da der Colorkey immer so nette Render zwichen an dem übergang hat... _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|