Está en la página 1de 3

DESARROLLO DE SISTEMAS DISTRIBUIDOS

Introduccin a la programacin de videojuegos con SDL 2.0


Parte 1
Elaborado por: Ukranio Coronilla

La lgica de ejecucin en un videojuego se basa en un ciclo infinito que realiza ciertas tareas
fundamentales, en el orden que se muestra a continuacin:
termina = 0;
while(!termina){
Lee mouse o teclado para ver si se va a realizar una accin;
Procesar la accin como moverse o disparar;
Realizar lgica del juego que no queda bajo control del jugador como movimiento de agentes, clculo de trayectoria de
disparos, clculo de colisiones, transferencia de datos en red;
Tareas de actualizar scroll de fondo o activar sonidos, sincronizacin;
Mostrar el nuevo frame;
}

A continuacin se muestra el programa sdl1.cpp que muestra como abrir una ventana, crear un
contexto de renderizado, y dibujar una imagen que tengamos guardada en un archivo hacia la
pantalla.
El renderizado (rendering en ingls) es el proceso de generar una imagen o vdeo mediante el
clculo de iluminacin GI partiendo de un modelo en 3D. Esto implica clculos de iluminacin y
superposicin de texturas en modelos tridimensionales. El proceso se muestra en la siguiente
figura.
Una textura es una imagen del tipo bitmap utilizada para cubrir la superficie de un objeto virtual,
ya sea tridimensional o bidimensional, con un programa de renderizado.

sdl1.cpp
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char** argv){
if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window *win = SDL_CreateWindow("Hola Mundo!", 100, 50, 640, 480, SDL_WINDOW_SHOWN);
if (win == nullptr){
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC);
if (ren == nullptr){
std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Surface *bmp = SDL_LoadBMP("./hello.bmp");
if (bmp == nullptr){
std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
SDL_FreeSurface(bmp);
if (tex == nullptr){
std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_RenderClear(ren);
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderPresent(ren);
SDL_Delay(5000);
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}

Explicaremos las funciones principales marcadas en negritas y la lgica asociada a ellas:


La funcin SDL_init inicializa los distintos subsistemas de SDL y verifica que todo est bien. Se
pueden inicializar solo algunos subsistemas, el mnimo necesario es el SDL_INIT_VIDEO. Si todo sale
bien devuelve 0.
Posteriormente necesitamos una ventana para que en su interior pueda crearse un render. Con la
funcin SDL_CreateWindow creamos una ventana con el ttulo "Hola Mundo" en la posicin 100, 50
con ancho de 640, alto de 480 y la mostramos; si algo sale mal devuelve nullptr. En la nueva
versin de C++ (C++ 11) nullptr designa un apuntador null universal.

Teniendo la ventana, podemos crear un renderizador con SDL_CreateRenderer. Esta funcin toma la
ventana y la asocia con un driver de renderizado definido con un ndice, si este es -1 entonces se
utiliza el primero que rena los requerimientos especificados en el tercer parmetro.
Para este caso utilizamos dos banderas cuyo significado es el siguiente:
Bandera SDL_RENDERER_ACCELERATED, queremos usar hardware de aceleracin en la tarjeta
de video.
Bandera SDL_RENDERER_PRESENTVSYNC, queremos que la funcin de presentacin se
sincronice con la velocidad de refresco del monitor.
Para renderizar una imagen BMP necesitamos primero cargarla en memoria y posteriormente
hacia el hardware de renderizado (renderizador), que en este caso es la unidad de procesamiento
grfico (GPU). La funcin SDL_LoadBMP carga la imagen y devuelve una SDL_Surface* que podremos
entonces convertir a SDL_Texture con la funcin SDL_CreateTextureFromSurface para que pueda ser
utilizada por el renderizador.
A continuacin liberamos la superficie con la funcin SDL_FreeSurface puesto que ya no va a ser
necesario ocupar ese espacio de memoria.
Ahora vamos a dibujar la imagen, pero primero limpiamos el renderer con la funcin
SDL_RenderClear.
Con la funcin SDL_RenderCopy renderizamos la textura, le pasamos NULL en los parmetros tres y
cuatro porque queremos renderizar la imagen completa y tambin queremos que se ajuste a la
pantalla.
Actualizamos la pantalla con SDL_RenderPresent ejecutando as el renderizado. Posteriormente
dejamos que el programa espere 5 segundos con SDL_Delay, as damos oportunidad para ver la
pantalla.
Por ltimo destruimos todos los objetos en memoria que habamos creado y salimos de SDL con
SDL_Quit.