Désafficher une texture en SDL/C++

Fermé
Xaecoremixx - 22 mai 2023 à 20:42
[Dal] Messages postés 6184 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 mai 2024 - 24 mai 2023 à 12:21

Bonjour,

Je débute en C++ et je suis en train de coder un petit jeu en 2D avec la bibliothèque graphique SDL2. Seulement le problème c'est que j'arrive à afficher des images et du texte (SDL_TTF) (en tant que texture), mais je n'arrive pas à les désafficher, ce qui est problématique pour les déplacements d'images tels que les monstres ou l'avatar du joueur.

J'ai cherché sur internet comment le faire, mais la seule chose que j'ai trouvé me parle de réafficher toutes les textures par dessus la texture qu'on veut désafficher. Le problème avec cette technique, c'est que les textures mettent un certain temps pour se réafficher par dessus ; je me demandais s'il n'y avait pas un moyen d'effacer une texture sans passer par le SDL_renderpresent qui actualise tout le rendu. (une sorte de SDL_texturepresent).

Une autre piste que j'ai exploré est de recolorier toute la texture en transparent, mais je n'ai pas trouvé le paramètre qui permet de dessiner en remplaçant les pixels déjà existants au lieu de dessiner par dessus.

Est-ce que quelqu'un pourrait donc m'aider à désafficher une texture ?

et dans l'hypothèse peu probable où ce ne serait pas possible, avez-vous une recommandation pour une bibliothèque graphique haut niveau qui permette de désafficher des images ?

1 réponse

[Dal] Messages postés 6184 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 mai 2024 1 086
Modifié le 24 mai 2023 à 12:56

Salut Xaecoremixx,

je n'arrive pas à les désafficher, ce qui est problématique pour les déplacements d'images tels que les monstres ou l'avatar du joueur.

J'ai cherché sur internet comment le faire, mais la seule chose que j'ai trouvé me parle de réafficher toutes les textures par dessus la texture qu'on veut désafficher.

La boucle d'animation ne fonctionne pas comme cela. A chaque itération tu dois redessiner complètement l'écran.

En gros, ta boucle resseble à ceci :

  • tu utilises SDL_RenderClear() pour vider le renderer avec la couleur de dessin par défaut (par exemple le noir si tu as définit cette couleur)

  • tu copies ta texture à un autre endroit avec SDL_RenderCopy() et, plus généralement, tu envoies au renderer tous les éléments nécessaires au dessin complet de l'écran

  • tu utilises SDL_RenderPresent() pour afficher le résultat à l'écran

(bien sûr dans la boucle tu gères aussi les entrées éventuelles du clavier, souris, joystick, mais là ta question porte sur l'affichage)

Les textures de SDL sont gérées au niveau de la carte graphique, sur la VRAM en utilisant l'accélération matérielle.

Sur un ordinateur moderne, le fait de devoir effacer tout l'écran et de devoir le redessiner complètement à chaque itération n'est pas problématique. Tu dois même gérer un temps d'attente pour éviter que ton FPS n'explose les ressources du processeur pour les opérations gérées par celui-ci en faisant tourner inutilement à fond la boucle.

Théoriquement, tu pourrais, au lieu de faire SDL_RenderClear() gérer pour chaque objet que tu veux faire "bouger" deux sprites : un qui conserve le fond d'écran tel qu'il est avant de dessiner à un endroit donné et un autre qui représente ce que tu veux dessiner.

En pratique, cela complique considérablement la gestion de ta boucle pour un gain très discutable.

Cela serait totalement inadapté aux textures qui reposent sur l'usage du GPU et il faudrait travailler avec les surfaces qui utilisent le CPU.

avez-vous une recommandation pour une bibliothèque graphique haut niveau qui permette de désafficher des images ?

Non, mais je ne les connais pas toutes.

0