JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=d2297a3c9349613dbb03be1df1399eb3Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DirectDraw + Colorkey

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 20.04.2006, 23:23    Titel: DirectDraw + Colorkey Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 00:47    Titel: Antworten mit Zitat

Was heißt "dass es nicht mehr funktioniert"?
Was passiert, was passiert nicht?

Ohne die Infos können wir dir schlecht helfen Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 00:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 02:18    Titel: Antworten mit Zitat

*lol* nein, sonst würd ich dich ja verstehen Razz

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 02:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum