jueves, 26 de mayo de 2011

Tutorial Vibora Parte 1

Empezaremos con el primer tutorial de la creacion de videojuegos en C++ con SDL.

Asumo que ya tienes conocimientos minimos de C++, si no es asi te recomiendo que busques un tutorial o libro de C++ antes de leer este tutorial.
El codigo fuente se encuentra al final del tutorial

¿Que es lo que vamos a lograr en este tutorial?




Detalles:
  • Inicializar graficos para nuestro juego
  • Cargar Datos
  • Obtener del teclado hacia donde va la vibora
  • Actualizar posicion de la vibora
  • Dibujar Vibora

Diagrama de flujo: (no es tecnico, solo representa a gran escala como va el juego)

Empezamos: Inicializando Graficas
Lo primero que vamos a crear es una clase para lo grafico, es decir, inicializar la ventana,dibujar, cargar imagenes, etc.
Crearemos 2 archivos, uno llamado graphic.hh (la cabecera) y el otro graphic.cc (implementación), el nombre lo puedes poner como quieras, pero asi le llamaremos nosotros.
---- Archivo graphic.hh ----



Si ya tienes experiencia en C++, este codigo es muy facil de entender, aun asi dare una pequeña explicacion sobre lo que es de SDL.

Cabeceras nuevas
SDL.h: Aqui contiene todos los prototipos de las funciones relacionadas con SDL
SDL_image.h: Esta es una 'extension' que se utiliza para trabajar con imagenes

Variables nuevas 
SDL_Surface: esta variable guarda el puntero hacia una superficie SDL. 
Una superficie SDL es aquella en la cual podemos dibujar. La propia pantalla se tratara como una superficie SDL.

 ---- Archivo graphic.cc ----



Vamos a analizar un poco el codigo.
cGraphic::cGraphic: El constructor no tiene gran cosa, simplemente asigna variables para la posterior inicializacion.

cGraphic::init: Aqui inicializamos SDL
Encontramos 2 nuevas funciones: SDL_Init y SDL_SetVideoMode.
SDL_Init se utiliza para inicializar los diferentes componentes de SDL, como es el video, audio, joystick,cdrom, entre otros. Regresa -1 cuando hay algun error.
En este caso solo utilizamos SDL_INIT_VIDEO para inicializar el video.
Sintaxis:
     SDL_Init( Uint32 flag );
Flags mas utilizadas
SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_EVERYTHING


SDL_SetVideoMode se utiliza para definir los diferentes parametros que tendra nuestra ventana, por ejemplo el alto, ancho, bits por pixel y otros atributos que se utilizan para dibujar la pantalla, como si se va a realizar la renderizacion por medio de software o hardware, si se va a abrir en pantalla completa. En error regresa NULL, si no regresa el puntero de la superficie de la pantalla(SDL_Surface).
En este caso utilizamos SDL_HWSURFACE, para crear la superficie en la memoria de la tarjeta de video, SDL_DOUBLEBUF, para crear un doble buffer y opcionalmente SDL_FULLSCREEN, que crea la ventana en pantalla completa.
Sintaxis:
      SDL_SetVideoMode( int ancho, int alto, int bitsporpixel, Uint32 flags );
Flags mas utilizadas
SDL_SWSURFACE
SDL_HWSURFACE
SDL_DOUBLEBUF
SDL_FULLSCREEN
SDL_OPENGL
SDL_NOFRAME

cGraphic::draw: Esta funcion la utilizamos para actualizar la pantalla.
Aqui tenemos una nueva funcion: SDL_Flip
SDL_Flip en pocas palabras se utiliza para actualizar la pantalla. Toma como parametro la superficie (SDL_Surface*) que obtuvimos con SDL_SetVideoMode. Regresa -1 cuando hay algun error.
Sintaxis:
      SDL_Flip( SDL_Surface* surface );

cGraphic::loadImage: Esta funcion se encarga de cargar una imagen desde un archivo.
Aqui utilizamos IMG_Load
IMG_Load no es una funcion de SDL, sino de SDL_image, sirve para cargar una imagen desde un archivo y convertirla a una superficie SDL (SDL_Surface). Toma como parametro la ruta del archivo. Regresa NULL cuando no la puede cargar.
Sintaxis:
      IMG_Load( const char* filename );

cGraphic::clear: Esta funcion la utilizamos para "limpiar" la pantalla, en si lo que hacemos es pintarla de color negro.
Aqui tenemos una nueva funcion: SDL_FillRect
SDL_FillRect es utilizada para "pintar" una region de una superficie con cierto color. Toma como parametro la superficie que se va a pintar, el area que se va a pintar (SDL_Rect) y por ultimo el color. Si el 2do parametro es NULL, se pintara toda la superficie.

Sintaxis:
      SDL_FillRect( SDL_Surface* surface, SDL_Rect *dst, Uint32 color );

Con esto finalizamos los archivos para manejar las graficas.
En pocas palabras lo que realizamos es:
  • Inicializar SDL con SDL_Int
  • Crear Superficie de la pantalla con SDL_SetVideoMode
  • Limpiar Pantalla con SDL_FillRect
  • Actualizar Pantalla con SDL_Flip
Edicion:
Se me olvido mencionar algo, para compilar el programa tienen que agregar las librerias de SDL y SDL_image, ve a las opciones de proyecto (project<project options) y en la pestaña Parameters en el cuadro Linker agrega -lmingw32 -lSDLmain -lSDL_image -lSDL

    No hay comentarios:

    Publicar un comentario