2017-04-12 3 views
0

Je me suis arraché les cheveux sur la façon de faire cet effet simple. J'ai une image (voir ci-dessous), et quand cette image est utilisée dans un jeu, elle produit une transition dans le sens des aiguilles d'une montre vers l'effet noir. J'ai essayé de recréer cet effet dans SDL (2) mais en vain. Je sais que ça a quelque chose à voir avec le masquage mais je ne sais pas comment faire ça en code. Le plus proche que j'ai pu obtenir était en utilisant "SDL_SetColorKey" et en incrémentant les valeurs RVB de sorte qu'il pas dessiner la partie "essuyage" de l'animation.Transition/effacement animé en utilisant SDL2 et un masque noir/blanc?

Uint32 colorkey = SDL_MapRGBA(blitSurf->format, 
    0xFF - counter, 
    0xFF - counter, 
    0xFF - counter, 
    0 
); 
SDL_SetColorKey(blitSurf, SDL_TRUE, colorkey); 

// Yes, I'm turning the surface into a texture every frame! 
SDL_DestroyTexture(streamTexture); 
streamTexture = SDL_CreateTextureFromSurface(RENDERER, blitSurf); 

SDL_RenderCopy(RENDERER, streamTexture, NULL, NULL); 

J'ai cherché partout et je suis maintenant juste désespérément une réponse pour mon propre curiosity- et le bon sens! Je suppose que cette question n'est pas exactement spécifique à SDL; J'ai juste besoin de savoir comment penser à ça!

Répondre

0

Arbitrairement est venu avec une solution. C'est cher, mais ça marche. En parcourant tous les pixels dans l'image et la cartographie de la couleur comme ceci:

int tempAlpha = (int)alpha + (speed * 5) - (int)color; 
int tempColor = (int)color - speed; 
*pixel = SDL_MapRGBA(fmt, 
       (Uint8)tempColor, 
       (Uint8)tempColor, 
       (Uint8)tempColor, 
       (Uint8)tempAlpha 
      ); 

où alpha est l'alpha actuelle du pixel, la vitesse est la vitesse paramétrée de l'animation, et la couleur est la couleur courante du pixel . fmt est le SDL_PixelFormat de l'image. Ceci est pour la décoloration au noir, ce qui suit est pour la décoloration dans du noir:

if ((255 - counter) > origColor) 
       continue; 
int tempAlpha = alpha - speed*5; 
*pixel = SDL_MapRGBA(fmt, 
       (Uint8)0, 
       (Uint8)0, 
       (Uint8)0, 
       (Uint8)tempAlpha 
      ); 

Où origColor est la couleur du pixel dans l'image en niveaux de gris d'origine. J'ai fait une API rapide pour faire tout cela, alors n'hésitez pas à le vérifier: https://github.com/Slynchy/SDL-AlphaMaskWipes