Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRANSPARENCE DIRECTDRAW (SIMULÉE)


Information sur la source

Catégorie :DirectX Classé sous : directdraw, transparence, 2d, graphisme, surface Niveau : Initié Date de création : 21/04/2006 Date de mise à jour : 06/08/2006 21:24:12 Vu / téléchargé: 4 054 / 242

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Qui a dit que DirectDraw ne permettait pas la transparence des surfaces ? Je ne parle pas des contours de sprites mais bien de leurs transparences. C'est une astuce très efficace pour ceux qui comme moi continuent à développer des jeux en 2D sans utiliser Direct3D même en mode immédiat (trop de contraintes par rapport aux bénéfices).
Donc voilà le code avec un exemple des plus simple que chacun pourra intégrer dans son code directDraw.
Ceci est une astuce très simple et elle ne cause pas de problème au FrameRate.
Locker la surface, et faire une grille décalée avec des pixels de la couleur de clef de transparence, puis selon un flag on la rétablit en rechargeant simplement l'image. Donc on active et désactive la transluence quant on veut.
 

Source

  • // La fonction principale
  • void MakeTransparent(LPDIRECTDRAWSURFACE4 surf, DWORD colKey)
  • {
  • DDSURFACEDESC2 ddsd;
  • HRESULT ret;
  • DWORD *primary_buffer;
  • LONG lpitch;
  • // Accès direct aux pixels
  • STRUCT_INIT(ddsd);
  • ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  • ret = surf->GetSurfaceDesc(&ddsd);
  • if( ret == DDERR_INVALIDOBJECT ||
  • ret == DDERR_INVALIDPARAMS )
  • return;
  • if( surf->Lock(NULL, &ddsd,
  • DDLOCK_SURFACEMEMORYPTR |
  • DDLOCK_WAIT, NULL) != DD_OK )
  • return;
  • primary_buffer = (DWORD*)ddsd.lpSurface;
  • lpitch = ddsd.lPitch >> 2;
  • // Boucle sur la surface et c'est tout !
  • for(DWORD y=0; y<ddsd.dwHeight; y++)
  • {
  • for(DWORD x=0; x<ddsd.dwWidth; x++)
  • {
  • if( y % 2 == 0 )
  • {
  • if( x % 2 != 0 )
  • primary_buffer[(y * lpitch) + x] = colKey;
  • }
  • else
  • {
  • if( x % 2 == 0 )
  • primary_buffer[(y * lpitch) + x] = colKey;
  • }
  • }
  • }
  • surf->Unlock(NULL);
  • }
// La fonction principale
void MakeTransparent(LPDIRECTDRAWSURFACE4 surf, DWORD colKey)
{
  DDSURFACEDESC2 ddsd;
  HRESULT ret;
  DWORD *primary_buffer;
  LONG lpitch;

  // Accès direct aux pixels

  STRUCT_INIT(ddsd);
  ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  ret = surf->GetSurfaceDesc(&ddsd);
  if( ret == DDERR_INVALIDOBJECT || 
      ret == DDERR_INVALIDPARAMS )
    return;
  if( surf->Lock(NULL, &ddsd, 
                 DDLOCK_SURFACEMEMORYPTR | 
                 DDLOCK_WAIT, NULL) != DD_OK )
    return;
  primary_buffer = (DWORD*)ddsd.lpSurface;
  lpitch = ddsd.lPitch >> 2;

  // Boucle sur la surface et c'est tout !

  for(DWORD y=0; y<ddsd.dwHeight; y++)
  {
    for(DWORD x=0; x<ddsd.dwWidth; x++)
    {
      if( y % 2 == 0 )
      {
        if( x % 2 != 0 )
	  primary_buffer[(y * lpitch) + x] = colKey;
      }
      else
      {
        if( x % 2 == 0 )
	  primary_buffer[(y * lpitch) + x] = colKey;
      }
    }
  }

  surf->Unlock(NULL);
}

Conclusion

Fait avec VS.net 2003.
Vous devez avoir quelque part dans votre PATH les librairies statiques d'un autre âge que sont ddraw.lib et dxguid.lib, c'est tout.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

25 mai 2006 21:39:47 :
Changement de la capture d'écran (on voit mieux le pourquoi du comment)
06 août 2006 21:24:12 :
Ajout d'une partie du code visible pour copier/coler

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Une surface DirectDraw dans un controle MFC ? [ par TigWdz ] Bonjour,Je voudrait créer une surface DirectDraw dans une boite de dialogue MFC (dans un "Picture Control" par exemple, pour avoir de boutons a cotés) DirectDraw : Blit de surface à surface [ par ouze ] salut à tousj'aurais besoin d'un coup de main avec directdraw. Mon problème : j'ai une surface avec deux couleurs (du vert et du blanc, le vert est la Surface, texture et flux video [ par fenrhyr ] Bonjour,Voila mon probleme. Je cree une texture avec CreateTexture(). Ensuite je fait texture-&gt;getsurfacelevel pour avoir une surface valide et j'u API WIndows et GroupBox : transparence de l'intitulé [ par LiBe444 ] Bonjour,Voici exposé le problème le plus simplement possible.Le message WM_SETFONT permet aux HWND de pouvoir de changer de police de caractère et d'ê initialisation de graphisme [ par dj200812002 ] j'ai un probleme dans initgraph car quand j'écrit le chemin de (EGAVGA.obj ) qui seb trouve dans le fichier 'bgi' le compilateur me donne un message d Fonction de transparence sous WinXP/2000 [ par elflink ] bonjour à tous,j'ai créé un logiciel beneficiant d'une couleur de transparence (avec la fonction prévue à cet effet de user32.dll). Néanmoins, lorsque allegroGL ... [ par screamX ] Je me tate en se moment pour développer un apps en 2D + 3D...je sais pas trop qu'elle lib utiliser... je 'maitrise' allegro mais la 3D c'est pas son f directdraw et dialog box [ par mannix ] Salut à tous, je débute en c++ et j'ai un peu de mal à comprendre tous les mecanismes qui permettent de manipuler facilement le fenetres. Je voudrais Gestion de collision 2d [ par norton ] Bonsoir, j'ai commencé un jeu en openGl genre space impact...bref j'ai pas inventé la poudre ;) Par contre je sait pas comment gérer efficacemment les Pb de transparence en OpenGL [ par greg63 ] Salut a tous, je débute en OpenGL et j'ai un petit pb avec la transparence : j'ai deux objets transparents qui sont cencés se croiser. C'est a dire qu


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.