¿Cuál es la forma correcta de escalar una superficie SDL? Encontré una explicación en línea pero requirió volver a dibujar la Superficie píxel por píxel. Parece que debería haber alguna manera 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.Forma correcta de escalar una superficie SDL sin recorte?
Respuesta
SDL no admite ajuste de escala de blitting. De acuerdo con la documentación de SDL_BlitSurface:
Nota: el blitter SDL no (todavía) tiene la capacidad de escalar la blitted superficies hacia arriba o hacia abajo como es el caso con otros mecanismos blitting más sofisticados. Tienes que encontrar algo por ti mismo si quieres escalar imágenes (por ejemplo, usa SDL_gfx).
Puede encontrar SDL_gfx here. Escribir tu propia función de blitting no es tan malo, podría ser un experimento de aprendizaje útil y divertido (aunque estarías 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 a función.
Para completar, y dado que la pregunta no especifica la versión de SDL, es posible escalar en SDL2 utilizando el método API SDL_RenderCopyEx
. No se necesitan libs adicionales además de la lib básica SDL2.
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
uno 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 está escalando una superficie sino más bien escalando una textura. El procedimiento debe ser tan relevante, ya que las superficies casi siempre se convierten en texturas antes de que la representación se realice en aplicaciones basadas en SDL2.
Referencia: https://wiki.libsdl.org/SDL_RenderCopyEx
Cree sus texturas como de costumbre:
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
Y cuando es el momento para hacerlo, llame SDL_RenderCopyEx
en lugar de SDL_RenderCopy
Sé que esta respuesta es demasiado tarde para ayudar a la persona que lo solicitó, pero decidí escribir esto para ayudar a cualquier persona que tropiece con esta pregunta. En SDL 2.0, puede usar la función SDL_BlitScaled()
para escalar una superficie en un destino SDL_Rect
. Hay un tutorial por LazyFoo que describe esto, o mira esto documentation.
- 1. ¿Cómo escalar a resolución en SDL?
- 2. superficie de video SDL en movimiento
- 3. ¿Cuál es la forma más rápida de borrar un bloque de memoria (o una superficie SDL)?
- 4. WPF: ¿la forma correcta de escalar un camino?
- 5. Forma correcta de inicializar Car sin firmar *
- 6. UIViewContentModeScaleAspectFill sin recorte
- 7. AffineTransform: escalar una forma desde su centro
- 8. SDL: ¿Qué es un Blit?
- 9. ¿Python y pygame son una buena forma de aprender SDL?
- 10. Backbone.js: ¿forma correcta de filtrar una colección?
- 11. Forma correcta de convertir char * a NSString sin initWithCString?
- 12. Forma correcta de vaciar una C-String
- 13. Forma correcta de configurar una propiedad BOOL
- 14. Sprites de escala en SDL
- 15. Establecer PDF para imprimir sin escalar
- 16. C++ SDL en MacOSX sin Xcode
- 17. dividida maravilloso y sin recorte final
- 18. Máscara de recorte en forma de sector circular con Path.addArc?
- 19. Forma correcta de probar gemas
- 20. Forma correcta de detener IntentService
- 21. forma correcta de utilizar StringBuilder
- 22. Forma correcta de crear formularios
- 23. La forma "correcta" de definir una excepción en Python sin la queja de PyLint
- 24. SDL
- 25. forma correcta de almacenar una excepción en una variable
- 26. Recorte de imagen C# sin la biblioteca .net
- 27. máscara de recorte vml
- 28. forma más sencilla de gráficos 3D superficie dada puntos 3d
- 29. Forma correcta de heredar de std :: exception
- 30. ¿Cómo escalar un UIImage sin suavizar nada?