Programación para Juegos. Lección 4 . Programación orientada a eventos

05/04/2019Artículo original

Pueden descargar el código fuente de esta lección.

En este tutorial veremos como capturar y manejar eventos.

Un evento es simplemete algo que pasa. Como presionar una tecla, mover el ratón, redimensionar la ventana o cuando el usuario quiere cerrar la ventana.

//The headers#include"SDL/SDL.h"#include"SDL/SDL_image.h"#include<string>//Screen attributesconstintSCREEN_WIDTH=640;constintSCREEN_HEIGHT=480;constintSCREEN_BPP=32;//The surfacesSDL_Surface*image=NULL;SDL_Surface*screen=NULL;

Arriba tenemos lo que hemos ido aprendiendo hasta ahora, las cabeceras, constantes e imágenes.

//Variable de tipo evento, para posteriormente manejarlo.SDL_Eventevent;

Una estructura SDL_Event almacena los datos del evento para que lo manejemos.

SDL_Surface*load_image(std::stringfilename){//The image that's loadedSDL_Surface*loadedImage=NULL;//The optimized image that will be usedSDL_Surface*optimizedImage=NULL;//Load the imageloadedImage=IMG_Load(filename.c_str());//If the image loadedif(loadedImage!=NULL){//Create an optimized imageoptimizedImage=SDL_DisplayFormat(loadedImage);//Free the old imageSDL_FreeSurface(loadedImage);}//Return the optimized imagereturnoptimizedImage;}voidapply_surface(intx,inty,SDL_Surface*source,SDL_Surface*destination){//Temporary rectangle to hold the offsetsSDL_Rectoffset;//Get the offsetsoffset.x=x;offset.y=y;//Blit the surfaceSDL_BlitSurface(source,NULL,destination,&offset;);}

Nuestras funciones para cargar y fusionar las imágenes, no ha cambiado nada con respecto al tutorial 2.

boolinit(){//Initialize all SDL subsystemsif(SDL_Init(SDL_INIT_EVERYTHING)==-1){returnfalse;}//Set up the screenscreen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);//If there was an error in setting up the screenif(screen==NULL){returnfalse;}//Set the window captionSDL_WM_SetCaption("Event test",NULL);//If everything initialized finereturntrue;}

La función de inicialización, que inicializa SDL, configura la ventana fijando un título para la misma y devuelve false si ocurre algún error.

boolload_files(){//Load the imageimage=load_image("x.png");//If there was an error in loading the imageif(image==NULL){returnfalse;}//If everything loaded finereturntrue;}

Función para cargar la imagen. Devuelve false si ocurre algún error.

voidclean_up(){//Free the imageSDL_FreeSurface(image);//Quit SDLSDL_Quit();}

Función para borrar los datos de la memoria al terminar el programa.

intmain(intargc,char*args[]){//Make sure the program waits for a quitboolquit=false;

Ésta es la función principal, donde creamos la variable que nos dirá cuando quiere el usuario cerrar la ventana. Al iniciar el programa, lógicamente la igualamos a false, ya que de lo contrario el programa finalizaría inmediatamente.

//Initializeif(init()==false){return1;}//Load the filesif(load_files()==false){return1;}

Llamamos a las funciones de inicialización y carga de imágenes que definimos anteriormente.

//Apply the surface to the screenapply_surface(0,0,image,screen);//Update the screenif(SDL_Flip(screen)==-1){return1;}

Con éste fragmento de código mostramos la imágen en pantalla.

//While the user hasn't quitwhile(quit==false){

Comenzamos el bucle principal, el cual seguirá funcionando hasta que el usuario fije la variable quit a true.

//While there's an event to handlewhile(SDL_PollEvent(&event;)){

En SDL cuando ocurre un evento, se coloca en la cola de eventos. Ésta cola de eventos contiene los datos de los eventos para cada evento que sucede.Por ejemplo si fuera a presionar un botón del ratón, mover el cursor y a continuación, presionar una tecla del teclado, la cola de eventos se vería así:

  Todo sobre los archivos .PDB: qué son y por qué se generan siempre al compilar una aplicación .NET

Lo que SDL_PollEvent() hace es sacar un evento de la cola y guardar sus datos en nuestra estructura de tipo Evento:

  Funciones reguladoras en JavaScript: cómo limitar el número de veces que se puede llamar a una función cada segundo (throttling y debouncing)

Por lo tanto este código es recoger datos de los eventos mientras haya en la cola.

//If the user has Xed out the windowif(event.type==SDL_QUIT){//Quit the programquit=true;}}}

Cuando el usuario clica en la X de la ventana, el tipo de evento que se genera es SDL_QUIT. Pero al hacer esto no implica que el programa termine, todo lo que hace este evento es informarnos que el usuario quiere salir del programa.Ahora que sabemos que el usuario quiere finalizar la ejecución del programa, asignamos el valor true a la variable quit, lo que romperá la ejecución del bucle while en el que nos encontramos.

//Free the surface and quit SDLclean_up();return0;}

Finalmente, llamamos a nuestra función clean_up() para que elimine las variables creadas por SDL.

  Cómo garantizar el soporte a largo plazo de tu aplicación .NET

Hay otras maneras de controlar eventos como SDL_WaitEvent() y SDL_PeepEvents(). Se puede encontrar más información sobre esto en la documentación de SDL.

Fuente:

lazyfoo.net

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad