« Programmation avec la SDL/Les surfaces » : différence entre les versions

Contenu supprimé Contenu ajouté
Paragraphe : affichage de base
Ligne 86 :
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,SDL_Surface* surface);
</source>
*Création du rectangle sur lequel on va coller notre texture.
*Création du rectangle sur lequel on va coller notre texture. Pour cela, on déclare une variable de type SDL_Rect qui va recevoir d'une part la position sur le renderer à laquelle on veut afficher la texture et d'autre part les dimensions du rectangle. Si vous voulez coller la texture en entier, il nous faut un rectangle de même dimension. Pour cela, utilisez la fonction '''SDL_QueryTexture''', qui permet de récupérer plusieurs attributs d'un texture et en particulier sa largeur et sa hauteur. Si vous ne souhaitez afficher qu'une partie de la surface, reportez vous au paragraphe suivant.
*On affiche la texture grâce à la fonction '''SDL_RenderCopy'''.
 
Ligne 103 :
maTexture = SDL_CreateTextureFromSurface(renderer,maSurface);
SDL_FreeSurface(maSurface); // Maintenant qu'on a la texture, on n'a plus besoin de la surface
SDL_QueryTexture(maTexture,NULL,NULL,&maTexture_position.w,&maTexture_position.h); //permet d'initialiser correctement maTexture_position.w et maTexture_position.h.
 
SDL_RenderCopy(renderer,maTexture,NULL,&maTexture_position);
</source>
 
Certes, cela paraît un petit peu compliqué au premier abord mais c'est toujours le même schéma et, à moins que vous soyez poussez par une curiosité sans borne, vous n'avez pas vraiment besoin de savoir à quoi correspondent tous les ''NULL'' dans les arguments des fonctions ci-dessus.
 
Mais ne manquerait-il pas quelque chose? Nous avons alloué une texture et à aucun moment nous n'avons libéré la mémoire. Il faut donc, une fois que la texture n'est plus utile, appeler la fonction '''SDL_DestroyTexture''' comme suit :
<source lang="c">
SDL_DestroyTexture(maTexture);
</source>
 
===Affichage avancé===
Parfois, il peut être nécessaire de n'afficher qu'un bout de la texture. Pour ceux qui débutent et qui ne codent pas encore, sachez que c'est possible et sautez le paragraphe puis, lorsque vous en aurez besoin, revenez le lire !
 
Pour cela, il nous faut voir le prototype de la fonction '''SDL_RenderCopy'''. Le voici :
<source lang = "c">
int SDL_RenderCopy(SDL_Renderer* renderer , SDL_Texture* texture , const SDL_Rect* srcrect , const SDL_Rect* dstrect);
</source>
 
La fonction renvoie 0 si tout c'est bien passé et une valeur négative sinon. On peut donc procéder à l'éternelle vérification du bon fonctionnement de la fonction mais je vous laisse le soin de la faire (cf chapitre précédent si vous n'y arrivez pas).
 
Ce qui nous intéresse, ce sont les arguments ''srcrect'' et ''dstrect'' qui correspondent respectivement à la source et à la destination de la texture.
*La source est le rectangle au sein même de la texture que l'on veut afficher. Attention, la position du rectangle correspond à un repère relatif à l'angle en haut à gauche de la texture et non du renderer. Si l'on envoie NULL, ce rectangle sera la texture entière.
*La destination est un rectangle relatif à la texture dans lequel on va afficher la source. En fait, c'est comme si l'on considérait que la source était une nouvelle texture de la taille du rectangle relatif à la texture et qu'on l'affichait à la position indiquée par la destination. Quand à la largeur et à la hauteur de la destination, on s'arrangera pour que ce soit les mêmes que la taille et la hauteur de la source, ce qui explique pourquoi dans le code précédent on a eu besoin de faire appel à la fonction '''SDL_QueryTexture''' pour récupérer la largeur et la hauteur de la texture dans son entier.
 
==Couleurs et transparence==