Quelle est la bonne façon de mettre à l'échelle une surface SDL ? J'ai trouvé une explication en ligne, mais il fallait redessiner la surface pixel par pixel. Il semble qu'il devrait y avoir un moyen de faire cela nativement à travers SDL plutôt que de redessiner l'image de cette manière. Je n'ai rien trouvé dans la documentation SDL à ce sujet. Je peux redimensionner les surfaces sans problème en modifiant la largeur et la hauteur des surfaces, mais la surface résultante est coupée.
Réponses
Trop de publicités?Je sais que cette réponse arrive bien trop tard pour aider la personne qui l'a posée, mais j'ai décidé d'écrire ceci pour aider tous ceux qui tombent sur cette question. Dans SDL 2.0, vous pouvez utiliser la fonction SDL_BlitScaled()
fonction permettant de convertir une surface en un objet ciblé SDL_Rect
. Il existe un tutoriel de LazyFoo qui décrit cette situation, ou consultez le document suivant la documentation .
SDL ne prend pas en charge le blitting à l'échelle. D'après la documentation de SDL_BlitSurface :
Remarque : le blitter SDL n'a pas (encore) la capacité de n'a pas la capacité de mettre à l'échelle les surfaces blitées comme c'est le cas avec d'autres comme c'est le cas avec d'autres plus sophistiqués. [ ] trouver quelque chose par vous-même si si vous voulez mettre des images à l'échelle (par exemple en utilisant SDL_gfx).
Vous pouvez trouver SDL_gfx aquí . Ecrire sa propre fonction de blitting n'est pas si mal, cela pourrait être une expérience d'apprentissage amusante et utile (bien que vous réinventeriez la roue). L'utilisation d'OpenGL est également une option, car des choses comme la mise à l'échelle et la rotation peuvent être faites en un seul appel de fonction.
Pour être complet, et parce que la question ne précise pas la version de SDL, la mise à l'échelle est possible dans SDL2 en utilisant la méthode API SDL_RenderCopyEx
. Aucune librairie supplémentaire n'est nécessaire en dehors de la librairie SDL2 de base.
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 des dstrect
on peut mettre la texture à l'échelle d'un nombre entier de pixels. Il est également possible de faire pivoter et de retourner la texture en même temps.
Techniquement, il ne s'agit pas d'une mise à l'échelle d'une surface, mais d'une mise à l'échelle d'une texture. La procédure devrait cependant être la même puisque les surfaces sont presque toujours converties en textures avant le rendu dans les applications basées sur 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 lorsque le moment est venu de procéder à l'équarrissage, il suffit d'appeler SDL_RenderCopyEx
au lieu de SDL_RenderCopy