Transparence directdraw (simulée)

Description

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.