Pregunta

¿Cuál es la forma correcta de escalar una superficie SDL? Encontré una explicación en línea, pero requería volver a dibujar la superficie píxel por píxel. Parece que debería haber alguna forma de hacerlo de forma nativa a través de SDL en lugar de volver a dibujar la imagen de esa manera. No he podido encontrar nada en la documentación de SDL que cubra esto. Puedo cambiar el tamaño de las superficies sin ningún problema modificando el ancho y la altura de las superficies, pero la superficie resultante se recorta.

¿Fue útil?

Solución

SDL no es compatible con el escalado bliting. De acuerdo con la documentación de SDL_BlitSurface :

  

Nota: el blitter SDL no (todavía)   tener la capacidad de escalar el   superficies arruinadas hacia arriba o hacia abajo como es   el caso con otros más sofisticados   mecanismos de interrupción. Tienes que   averiguar algo por ti mismo si   desea escalar imágenes (por ejemplo, usar   SDL_gfx).

Puede encontrar SDL_gfx aquí . Escribir su propia función de blitting no es tan malo, podría ser un experimento de aprendizaje divertido y útil (aunque estaría reinventando la rueda). Usar OpenGL también es una opción, ya que cosas como escalar y rotar se pueden hacer en una sola llamada de función.

Otros consejos

Sé que esta respuesta es demasiado tarde para ayudar a la persona que la hizo, pero decidí escribir esto para ayudar a cualquiera que se tope con esta pregunta. En SDL 2.0 puede usar la función SDL_BlitScaled () para escalar una superficie en un SDL_Rect de destino. Hay un tutorial de LazyFoo que describe esto, o consulte esto documentación .

Para completar, y debido a que la pregunta no especifica la versión SDL, es posible escalar en SDL2 utilizando el método API SDL_RenderCopyEx . No se necesitan libs adicionales además de la lib SDL2 básica.

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)

Al establecer el tamaño de dstrect se puede escalar la textura a un número entero de píxeles. También es posible rotar y voltear la textura al mismo tiempo.

Técnicamente, esto no es escalar una superficie, sino escalar una textura. Sin embargo, el procedimiento debe ser tan relevante como las superficies casi siempre se convierten en texturas antes de que el renderizado ocurra en aplicaciones basadas en SDL2.

Referencia: https://wiki.libsdl.org/SDL_RenderCopyEx

Crea tus texturas como de costumbre:

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

Y cuando llegue el momento de representarlo, llame a SDL_RenderCopyEx en lugar de SDL_RenderCopy

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top