begin process at 2012 02 12 23:49:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

DirectX

 > TRANSPARENCE DIRECTDRAW (SIMULÉE)

TRANSPARENCE DIRECTDRAW (SIMULÉE)


 Information sur la source

Note :
Aucune note
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 901 / 288

Auteur : yann_lo_san

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture [C++/WIN32] RECHERCHE DE FUITES DE MEMOIRE
Source avec Zip Source avec une capture PIECHART SUR DIALOG SANS RESSOURCE
Source avec Zip Source avec une capture [C++/WIN32] TYPEDEF_VIEWER (CONTROLES ETENDUS)
Source avec Zip EFFET GRAPHIQUE DIRECTDRAW
Source avec Zip Source avec une capture [C++/WIN32] COMPRESSEUR/DECOMPRESSEUR LZW

 Sources de la même categorie

Source avec Zip Source avec une capture MP3 DX9 JOUER par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture EQUINOX VISUAL SON METER par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture FLEUR EN DELIRE! par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture DIREXCT X 9 D3D par f_l_a_s_h_b_a_c_k
Source avec Zip BLOP DIRECT X par f_l_a_s_h_b_a_c_k

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EVALUATEUR_EXPRESSION_ARITHMETIQUE par Donald180v
Source avec Zip Source avec une capture XCOUPE : COUPE 2D par pop70
GÉRER UN COMBAT DANS UN JEU 2D / ALGORITHME PRIMAIRE D'UNE I... par Chiheb2010
Source avec Zip Source avec une capture HIGHWAY SIMULATOR par FrancoisGauthier
Source avec Zip EFFET GRAPHIQUE DIRECTDRAW par yann_lo_san

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 direct draw [ par micflor ] Bonjour, pouvez-vous me dire pourquoi il ne semble pas possible d’écrire sur la surface primaire avec une couleur de transparence ? Lorsque je blit s 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales