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

Contenu supprimé Contenu ajouté
m Petite erreur
m Déplacement des paragraphes sur l'affichage vers les textures
Ligne 70 :
 
Pour chaque surface créée, vous devez avoir un "FreeSurface" correspondant. Cette étape est très importante car sinon, vous risquez d'encombrer la mémoire vive de votre ordinateur. Et, dans le cas où vous créez un grand nombre de surface, oublier de libérer celle-ci pourrait amener au plantage de votre programme et vous aurez alors beaucoup de mal pour comprendre d'où vient le bug.
 
==Charger une image==
Pour charger une image dans la SDL, il y a la fonction prédéterminée SDL_LoadBMP, qui ne prend en compte que les images avec l'extension .BMP. Pour profiter des autres formats d'images, une bibliothèque tierce est disponible sur le site de la SDL: SDL_Image.
 
==Afficher une surface==
Le type SDL_Surface ne dispose pas de l'accélération matérielle. Pour afficher une surface, nous allons donc utiliser une texture. Voici donc les étapes qui vont nous permettre d'afficher une surface :
===Affichage de base===
Le but d'une surface est évidemment d'être vue. Cependant, le type SDL_Surface ne dispose pas de l'accélération matérielle. Pour afficher une surface, on va donc avoir besoin d'un nouveau type : '''SDL_Texture''' qui permet de représenter des textures. Malgré tout, les textures ont leur propre défaut : une fois qu'ont les a définies, on ne peut plus les modifier. Voici donc les étapes qui vont nous permettre d'afficher une surface :
*Création de la surface que l'on souhaite afficher.
*Conversion de la surface en texture. Pour cela, on utilise la fonction qui prend en argument le renderer correspondant et la surface que l'on veut convertir
Ligne 82 ⟶ 78 :
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,SDL_Surface* surface);
</source>
*OnAffichage affichede la texture grâce à la fonction '''SDL_RenderCopy'''.
*Création du rectangle sur lequel on va coller notre texture.
*On affiche la texture grâce à la fonction '''SDL_RenderCopy'''.
 
Voici le code qui, en supposons qu'on a déjà déclaré un renderer avant, va vous permettre d'afficherde convertir une surface en entier à la position (50,100)texture :
 
<source lang = "c">
SDL_Surface* maSurface = NULL;
SDL_Texture* maTexture = NULL;
SDL_Rect maTexture_position;
 
maTexture_position.x = 50;
maTexture_position.y = 100;
 
//On modifie comme on veut la surface, on bien on charge une image
 
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);//Attention, cette fonction doit se trouver à l'intérieur de votre boucle d'affichage,
//sinon, elle ne s'affichera que pendant une milliseconde au début de votre programme
//pour un exemple de code plus complet, voir le TP1
</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>
 
Si vous avez essayé d'afficher une surface et que vous n'y êtes pas arrivé, il se peut que ce soit parce que votre surface est complètement noire étant donné qu'il n'y a rien dessus et que , par conséquent si votre fond est noir, vous ne la voyez pas. Il est également possible que vous ayez pla
 
===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.
 
==Modifier une surface==