10.07.2015 Views

[ebook]Programacion de videojuegos con SDL

[ebook]Programacion de videojuegos con SDL

[ebook]Programacion de videojuegos con SDL

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M A C I Ó N D E V I D E O J U E G O S C O N S D LAlgún avispado lector se preguntará qué ocurre si los campos w y h <strong>de</strong> los parámetrossrc<strong>de</strong>st y dstrect no coinci<strong>de</strong>n. Realmente no ocurre nada, ya que los campos w y h<strong>de</strong> dstrect no se utilizan. Por último, <strong>de</strong>cir que si la la copia tiene éxito la función<strong>de</strong>vuelve el valor 0, y –1 en caso <strong>con</strong>trario.Otra utilidad <strong>de</strong> la estructura <strong>SDL</strong>_Rect es la <strong>de</strong> dibujar rectángulos en la pantallamediante la función <strong>SDL</strong>_FillRect. Ilustrémoslo <strong>con</strong> un ejemplo:<strong>SDL</strong>_Rect <strong>de</strong>st;<strong>de</strong>st.x = 0;<strong>de</strong>st.y = 0;<strong>de</strong>st.w = screen->w;<strong>de</strong>st.h = screen->h;<strong>SDL</strong>_FillRect(screen,&<strong>de</strong>st,<strong>SDL</strong>_MapRGB(screen->format,0,0,0));Esta función dibuja un cuadrilátero en una superficie <strong>con</strong> el color indicado. En elejemplo se dibuja un rectángulo <strong>de</strong> color negro <strong>de</strong>l tamaño <strong>de</strong> la superficie (pantalla), o loque es lo mismo, borra la pantalla. El formato <strong>de</strong> la función es:int <strong>SDL</strong>_FillRect(<strong>SDL</strong>_Surface *dst, <strong>SDL</strong>_Rect *dstrect, Uint32 color);El primer parámetro es la superficie <strong>de</strong> <strong>de</strong>stino, el siguiente parámetro es <strong>de</strong> tipo<strong>SDL</strong>_Rect y <strong>de</strong>fine el rectángulo. Por último, hay que indicar el color <strong>de</strong> relleno. Un pocomás a<strong>de</strong>lante compren<strong>de</strong>remos el uso <strong>de</strong> <strong>SDL</strong>_MapRGB.Sigamos <strong>con</strong> la siguiente función:int <strong>SDL</strong>_Flip(<strong>SDL</strong>_Surface *screen);Si estamos usando doble buffer (como es el caso <strong>de</strong> nuestro ejemplo), esta funciónintercambia los buffers, es <strong>de</strong>cir, vuelca el <strong>con</strong>tenido <strong>de</strong>l buffer secundario al principal. Sitiene éxito <strong>de</strong>vuelve 0, si no, <strong>de</strong>vuelve –1. Si no usáramos doble buffer o nuestrohardware no lo soportara, tendríamos que usar <strong>SDL</strong>_UpdateRect(screen,0,0,0,0)en lugar <strong>de</strong> <strong>SDL</strong>_Flip(). El formato <strong>de</strong> esta función es:void <strong>SDL</strong>_UpdateRect(<strong>SDL</strong>_Surface *screen, Sint32 x, Sint32 y, Sint32 w,Sint32 h);Su misión es asegurar que el área que especifiquemos (sus parámetros <strong>de</strong>ben serteya familiares) sea actualizada.Como te veo <strong>con</strong> cara rara, quizás sea este el momento <strong>de</strong> explicar en qué <strong>con</strong>sisteeso <strong>de</strong>l doble buffer.Imagina que tienes que volcar a la pantalla los gráficos <strong>de</strong> tu juego. Primero pondríasel fondo (calculando previamente que porción <strong>de</strong>l fondo tienes que mostrar), mostraríaslas naves enemigas (calculando su posición previamente) y <strong>de</strong>spués dibujarías al héroe<strong>de</strong> tu juego. Entre el primer y el último gráfico que dibujas en pantalla pue<strong>de</strong> pasar untiempo bastante gran<strong>de</strong> (informáticamente hablando). Durante este tiempo, la imagen <strong>de</strong>lmonitor ha tenido tiempo <strong>de</strong> actualizarse varias veces (retrazo vertical).Desgraciadamente, cuando esto ocurre aparecen parpa<strong>de</strong>os y guiños (flicking)in<strong>de</strong>seados y muy molestos. Mediante la técnica <strong>de</strong>l doble buffer, todo el pintado se haceen una pantalla virtual, y sólo cuando está todo pintado, volcamos su <strong>con</strong>tenido a lapantalla real (flipping). Este proceso <strong>de</strong> volcado se hace a<strong>de</strong>más <strong>de</strong> forma sincronizada<strong>con</strong> el retrazo vertical <strong>de</strong>l monitor para evitar los parpa<strong>de</strong>os.Es importante (sobre todo en un lenguaje como C/C++) liberar los recursos que ya novamos a necesitar. En nuestro ejemplo usamos la función <strong>SDL</strong>_FreeSurface() paraliberar (borrar) la superficie que <strong>con</strong>tiene la imagen cargada. Su formato es:31

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!