Question

Quelle est la bonne façon de redimensionner une surface SDL? J'ai trouvé une explication en ligne, mais il a fallu redessiner la surface, pixel par pixel. Il semble qu'il devrait y avoir un moyen de le faire de manière native via SDL plutôt que de redessiner l'image de cette façon. Je n'ai trouvé aucun élément dans la documentation SDL couvrant ce sujet. Je peux redimensionner les surfaces sans aucun problème en modifiant la largeur et la hauteur des surfaces, mais la surface obtenue est tronquée.

Était-ce utile?

La solution

SDL ne prend pas en charge le blitting mis à l’échelle. Selon la documentation de SDL_BlitSurface :

  

Remarque: le blitter SDL n’a pas (encore)   avoir la capacité de mettre à l'échelle le   surfaces blanchies haut ou bas comme il est   le cas avec d'autres plus sophistiqués   mécanismes de blitting. Vous devez   comprendre quelque chose pour vous-même si   vous souhaitez redimensionner les images (par exemple, utilisez   SDL_gfx).

Vous pouvez trouver SDL_gfx ici . Écrire votre propre fonction de blitting n'est pas si mal que ça, ça pourrait être une expérience d'apprentissage amusante et utile (même si vous réinventiez la roue). Utiliser OpenGL est également une option, car des tâches telles que la mise à l'échelle et la rotation peuvent être effectuées en un seul appel de fonction.

Autres conseils

Je sais que cette réponse est bien trop tardive pour aider la personne qui l'a posée, mais j'ai décidé de l'écrire pour aider toute personne qui trébuche sur cette question. Dans SDL 2.0 Vous pouvez utiliser la fonction SDL_BlitScaled () pour redimensionner une surface en un SDL_Rect ciblé. Il existe un tutoriel sur LazyFoo qui décrit cela, ou consultez cette documentation .

Par souci d'exhaustivité et parce que la question ne spécifie pas la version SDL, la mise à l'échelle est possible dans SDL2 à l'aide de la méthode API SDL_RenderCopyEx . Aucune bibliothèque supplémentaire en plus de la bibliothèque SDL2 de base n'est nécessaire.

int SDL_RenderCopyEx(SDL_Renderer*          renderer,
                     SDL_Texture*           texture,
                     const SDL_Rect*        srcrect,
                     const SDL_Rect*        dstrect,
                     const double           angle,
                     const SDL_Point*       center,
                     const SDL_RendererFlip flip)

En définissant la taille de dstrect , vous pouvez redimensionner la texture en un nombre entier de pixels. Il est également possible de faire pivoter et retourner la texture en même temps.

Techniquement, il ne s’agit pas de redimensionner une surface, mais plutôt d’une texture. La procédure doit être tout aussi pertinente, car les surfaces sont presque toujours converties en textures avant le rendu dans les applications SDL2.

Référence: https://wiki.libsdl.org/SDL_RenderCopyEx

Créez vos textures comme d'habitude:

surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);

Et lorsqu'il est temps de le rendre, appelez SDL_RenderCopyEx au lieu de SDL_RenderCopy

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top