El problema está en el valor del parámetro zoom que le pasas a la función rotozoomSurface, recuerda que su prototipo es:
SDL_Surface * rotozoomSurface (SDL_Surface *src, double angle, double zoom, int smooth);
Por lo tanto para no hacer zoom y mantener el tamaño original debes pasar el valor 1.0 en el parámetro zoom, y no 0 (por eso no la ves!), es decir:
- Código: Seleccionar todo
// Girado 10 grados y tamaño original
superficie2=rotozoomSurface(superficie, 10, 1.0, 0);
Otro consejo, la superficie que devuelve la función rotozoomSurface guardala en otra superficie.
La función que utilizo para dibujar imagenes rotadas o escalas en tiempo real es la siguiente:
- Código: Seleccionar todo
void DrawSurface(SDL_Surface *src, int x, int y, float zoomx, float zoomy, float angle)
{
// Superficie temporal con las modificaciones correspondientes
SDL_Surface *tmp;
// Posición donde dibujaremos la superficie en pantalla
SDL_Rect pos={x, y, 0, 0};
// Creamos superficie rotada y/o escalada sin anti-aliasing
tmp=rotozoomSurfaceXY(src, angle, zoomx, zoomy, 0);
// Arreglo posición de la imagen ya que la rotación
// es con respecto al centro de la imagen
pos.x -= (tmp->w - src->w) / 2;
pos.y -= (tmp->h - src->h) / 2;
// Dibujamos en pantalla la nueva superficie
// Nota: screen es la variable que nos devolvió
// la función SDL_SetVideoMode
SDL_BlitSurface(tmp, NULL, screen, &pos);
// Eliminamos de la memoria la superficie temporal
SDL_FreeSurface(tmp);
}
Ojo, que la función anterior puede bajar el rendimiento si es llamada demasiadas veces dentro del game loop, ya que estamos realizando constantemente cálculos de rotación y escalado, y además creando y liberando memoria para superficies.
Una posible optimización al utilizar muchas transformaciones (rotación, escalado) en un juego, es generarlas antes del ciclo y almacenarlas en varias superficies.
Saludos!