Programación Aplicada - Tema 2

85
PROGRAMACIÓN APLICADA TEMA 2 – D ESARROLLO DE VIDEOJUEGOS Pontificia Universidad Católica Madre y Maestra Vicerrectoría Académica Facultad Ciencias de las Ingenierías Ingeniería en Sistemas y Computación - ISC

description

Diapositiva utilizada en clases hasta Enero 2013 por el profesor Miguel Moronta en las clases de Programación Aplicada, departamento de Ingeniería de Sistemas y Computación - ISC, en el campus de Santiago, Rep. Dom.

Transcript of Programación Aplicada - Tema 2

Page 1: Programación Aplicada - Tema 2

PROGRAMACIÓ

N

APLIC

ADA

TEMA 2

– DESARROLL

O DE V

IDEOJU

EGOS

Pontificia Universidad Católica Madre y MaestraVicerrectoría AcadémicaFacultad Ciencias de las IngenieríasIngeniería en Sistemas y Computación - ISC

Page 2: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

El juego es una actividad que se utiliza para la diversión y el disfrute de los participantes, en muchas ocasiones, incluso como herramienta educativa.

Los juegos normalmente se diferencian del trabajo y del arte, pero en muchos casos estos no tienen una diferenciación demasiado clara.

¿Qué es un juego?¿Qué es un juego?

Page 3: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Según la RAE: Ejercicio recreativo sometido a reglas en el cual se gana o se pierde.

Según Huizinga (1987): El juego es una acción u ocupación libre, que se desarrolla dentro de unos límites temporales y espaciales determinados, según reglas absolutamente obligatorias, aunque libremente aceptadas, acción que tiene fin en sí misma y va acompañada de un sentimiento de tensión y alegría y de la conciencia de -ser de otro modo- que en la vida corriente.

Concepto de JuegoConcepto de Juego

Page 4: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

La humanidad ha jugado desde siempre, incluso los animales lo hacen; por eso el juego se considera previo a la cultura misma; existen innumerables manifestaciones de esta actividad en sociedades de todos los tiempos y se cuenta con muchas obras de arte donde se aprecian estas manifestaciones lúdicas.

Historia de los JuegosHistoria de los Juegos

Page 5: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Si nos remontamos al pasado, podemos encontrar en la literatura y el arte antiguo pruebas que nos indican que jugar no es un invento de nuestros días.

Un ejemplo muy palpable seria la forma en que jugaban las tribus primitivas, se podía ver que el juego dependía mucho de lo que hacían en su diario vivir y también era una forma de supervivencia.

En Grecia tenemos el ejemplo ineludible de los juegos griegos que son sin duda los Juegos Olímpicos. Pensadores clásicos como Platón y Aristóteles ya daban una gran importancia al aprender jugando, y animaban a los padres para que dieran a sus hijos juguetes que ayudaran a «formar sus mentes» para actividades futuras como adultos.

Historia de los JuegosHistoria de los Juegos

Page 6: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

En la Edad Media el juego tenía escasa reglamentación y una estructura sencilla, y se utilizaban pocos objetos. La mayor parte se realizaban al aire libre, rudimentarios, lentos y sin pasión por el resultado. Pero años más tarde cuando surge el renacimiento todo cambia drásticamente, ya se había desligado muchas cosas de lo religioso, los juegos populares y tradicionales adquieren fuerza, justifican y refuerzan la posición de clase que los practica o que los contempla.

En tiempos más recientes el juego ha sido estudiado e interpretado de acuerdo a los nuevos planteamientos teóricos que han ido surgiendo en Psicología de Piaget (1932, 1946, 1962, 1966) que ha destacado tanto en sus escritos teóricos como en sus observaciones clínicas la importancia del juego en los procesos de desarrollo.

Historia de los JuegosHistoria de los Juegos

Page 7: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Platón (uno de los primeros en reconocer el valor práctico del juego) establece que los niños utilicen manzanas para aprender mejor las matemáticas.

También dice que los niños de tres años que más tarde serán constructores se sirvan de útiles auténticos pero de tamaño reducido.

Historia de los JuegosHistoria de los Juegos

Page 8: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Aristóteles menciona:

“hasta la edad de cinco años, tiempo en que todavía no es bueno orientarlos a un estudio, ni a trabajos coactivos, a fin de que estos no impida el crecimiento se les debe no obstante permitir movimientos para evitar la inactividad corporal; y este ejercicio puede obtenerse por varios sistemas, especialmente por el juego”.

Historia de los JuegosHistoria de los Juegos

Page 9: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Teorías sobre el juego:

-La teoría del exceso de energía (Herbert Spencer).

Sirve para gastar el sobrante de energía.

-La teoría de la relajación (Lazarus).

Sirve para relajar a los individuos.

-La teoría de la recapitulación (G.S. Hall).

El niño realiza actividades de sus ancestros.

-La teoría del pre-ejercicio (Karld Groos).

Es necesario para la maduración y el crecimiento.

Historia de los JuegosHistoria de los Juegos

Page 10: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Page 11: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Page 12: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Tipos de juegosTipos de juegos

Page 13: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Es un software creado para el entretenimiento en general y basado en la interacción entre una o varias personas y un aparato electrónico que ejecuta dicho videojuego.

Estos sistemas electrónicos son llamados “plataformas”. Ej.:, podemos mencionar computadores personales y consolas de videojuegos.

¿Qué es un videojuego?¿Qué es un videojuego?

Page 14: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

La palabra videojuegos está dividida en dos partes, video y juego, donde juego es el acto en el cual una o varias personas se entretienen y video es el visualizador de gráficos o medio en el cual se graban las imágenes y los sonidos.

Entendemos por videojuegos a todo tipo de juego digital interactivo o software creado para el entretenimiento en general y basado en la interacción entre una o varias personas y un aparato electrónico que ejecuta dicho videojuego. Este dispositivo electrónico puede ser una computadora, un sistema arcade, una videoconsola o un teléfono móvil, los cuales son conocidos como plataformas. En muchos casos, estos recrean entornos y situaciones virtuales en los cuales el jugador puede controlar a uno o varios personajes (o cualquier otro elemento de dicho entorno), para conseguir uno o varios objetivos por medio de unas reglas determinadas.

¿Qué es un videojuego?¿Qué es un videojuego?

Page 15: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Todo videojuego posee un medio de entrada usado para ser manipulado e interactuar con este, esta entrada se le conoce como Controlador de Juego y varía dependiendo de la plataforma que se utilice. Un ejemplo claro de esto pudiera ser un controlador de consola, el cual consistiría en un botón y una palanca de mando o varios botones y palancas en caso de ser otra plataforma.

¿Qué es un videojuego?¿Qué es un videojuego?

Page 16: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

En el año 1947 fue la primera vez que se concibió la idea de un videojuego al patentarla por Thomas T. Goldsmith, Jr. y Estle Ray Mann.

No fue hasta el 1952 cuando apareció el primer videojuego ejecutado en una computadora Edsac, en la universidad de Cambridge, llamado OXO. Fue desarrollado por Alexander S. Douglas, para una ilustración de su tesis de doctorado.

Historia de los videojuegosHistoria de los videojuegos

Page 17: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Era un tic-tac-toe simulado usando como controlador un teléfono de rotación. Se juega contra la computadora, en un tubo de rayos catódicos de 35x16 píxeles.

No tuvo gran auge debido a que las computadoras EDSAC eran exclusivas para la universidad de Cambridge.

Historia de los videojuegosHistoria de los videojuegos

Page 18: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

El segundo video juego permitía jugar Tennis de mesa entre dos jugadores. Fue desarrollado en el 1958 por William Higinbotham en su lugar de trabajo (Brookhave National Laboratory, una institución gubernamental).

Historia de los videojuegosHistoria de los videojuegos

Page 19: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Se ejecutaba usando un osciloscopio como monitor conectado a una computadora analógica.

Tenía el objetivo de entretener a los visitantes, usando una línea horizontal y otra pequeña céntrica vertical a modo de red, para simular la pista.

Historia de los videojuegosHistoria de los videojuegos

Page 20: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Cooperación: Tipo de juego en que es necesario cooperar con otros personajes o jugadores para completar los objetivos.

Acción: Los videojuegos de este género consisten básicamente en eliminar enemigos. El contenido tiende a ser violento. Entre estos se encuentran los juegos como vigilante 8 y Grand Theft Auto.

Cartas: Como bien dice su nombre, en este tipo de videojuegos el protagonista juega con cartas.

Disparos: En los cuales el protagonista debe abrirse el camino a base de disparos. Según la temática y desarrollo pueden clasificarse en diferentes subgéneros como disparos en primera persona o tercera persona. Algunos juegos de primera persona son: Quake, Halo, Call of Duty, Medal of Honor y Counter Strike. En tercera persona podemos mencionar también: Max Payne, Metal Gear yGears of War.

Tipos de VideojuegosTipos de Videojuegos

Page 21: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Aventura: Son videojuegos en los que el protagonista debe avanzar interactuando con diversos personajes y objetos. Entre este género podemos mencionar: Mario, Legend of Zelda, God of War, Batman, entre otros.

Educativos: Son videojuegos cuyo objetivo es dar a conocer al usuario algún tipo de conocimiento.

Estrategia: Se caracterizan por la necesidad de manipular a un numeroso grupo de personajes, objetos o datos para lograr los objetivos, en los cuales nos encontramos con: Age of Empires, Starcraft, Imperium, entre otros.

Lucha: Son videojuegos basados en el combate cuerpo a cuerpo.

Tipos de VideojuegosTipos de Videojuegos

Page 22: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Rol: Donde el protagonista interpreta un papel y ha de mejorar sus habilidades mientras interactúa con el entorno y otros personajes. Se suelen también caracterizar por que las decisiones de tu personaje influyen en su futuro próximo.

Simulación: Involucran al jugador en una situación simulada determinada. Entre estos se pueden citar Combat Flight Simulator, SimCity o Los Sims.

Deportivo: Son videojuegos basados en el mundo del deporte ya sea de NBA, Tennis, Futbol Americano, Beisbol, entre otros.

Carreras: Son videojuegos en los que se manejan diferentes vehículos, ya sean reales o ficticios, para ganar en diferentes carreras. Entre ellos podemos mencionar: Grand Turismo, Midnight Club, Mario Kart, Need for Speed.

Tipos de VideojuegosTipos de Videojuegos

Page 23: Programación Aplicada - Tema 2

Características básicas de un videojuegoResumen:

1. Escenario.

2. Elementos estáticos y dinámicos.

3. Reglas del juego.

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 24: Programación Aplicada - Tema 2

Estructura de un videojuego.

A. Características de los Videojuegos.

B. Arquitectura de un Videojuego.

C. Secuencia General de un

Videojuego.

D. Secuencia Lógica de un

Videojuego.

E. Secuencia de Estados de un

VideoJuego.

Resumen:

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 25: Programación Aplicada - Tema 2

Estructura de un videojuego.

A. Características de los VIDEOJUEGOS

1. Funciona en tiempo real.

2. Siempre se está realizando acciones como:

a. Dibujar los objetos.

b. Actualizar coordenadas.

c. Determinar colisiones.

d. Mover objetos.

3. Se ejecuta independiente la interacción del usuario.

4. Responde ante eventos de periféricos como teclado,

mouse, controles de juego.

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 26: Programación Aplicada - Tema 2

Estructura de un videojuego.B. Arquitectura de un VIDEOJUEGO.

RECURSOS

•Gráficos: texturas,

modelos, sprites, secuencias

cinemáticas, etc.

•Sonidos: efectos de

sonido, música, etc.

•Ficheros de datos:

configuración, salvas de

juegos, mapas, etc.

RECURSOS

Estado del Juego

Entrada Salida

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 27: Programación Aplicada - Tema 2

3. Estructura de un videojuego.

B. Arquitectura de un VIDEOJUEGO.

INTERFACES

•Gestión de

entradas: teclado,

ratón, joystick, etc.

•Gestión de

salidas: pantalla,

información a otros

jugadores, etc.

RECURSOS

Estado del Juego

Entrada Salida

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 28: Programación Aplicada - Tema 2

3. Estructura de un videojuego.B. Arquitectura de un VIDEOJUEGO.

LOGICA•Lógica de comportamiento: actualiza los elementos del juego según las acciones de los jugadores y las reglas del juego (vidas, matar enemigos, capturar objetos, etc.)

•Lógica del juego: gestiona la secuencia del juego (gráficos, entradas, salidas, sonido).

RECURSOS

Estado del Juego

Entrada Salida

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 29: Programación Aplicada - Tema 2

3. Estructura de un videojuego.B. Arquitectura de un VIDEOJUEGO.

ESTADO DEL JUEGO

Estructuras de datos en memoria que guardan el estado actual del juego.

RECURSOS

Estado del Juego

Entrada Salida

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 30: Programación Aplicada - Tema 2

3. Estructura de un videojuego.C. Secuencia General de un VIDEOJUEGO.

ESTRUCTURA

LOGICA

Inicialización

• Cargar drivers

gráficos

• Cargar drivers de

sonido

• Iniciar modo

gráfico

Secuencia Lógica

• Bucle que realiza

las

acciones que rigen la

dinámica del juego

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 31: Programación Aplicada - Tema 2

3. Estructura de un videojuego.

D. Secuencia Lógica de un VIDEOJUEGO.

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 32: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

INICIALIZACION

•Reserva de memoria

necesaria

•Inicializan las variables del

juego

•Abrir y cargar ficheros

(mapas)

•Cargar imágenes, sonidos y

vídeos

•Inicializar variables de

jugadores

•(vidas, armas, etc.)

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 33: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

GESTION DE ENTRADAS

•Procesar teclado•Procesar ratón•Procesar joystick u otros dispositivos

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 34: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

LOGICA DE COMPORTAMIENTO

•Captura de ítems•Detección de colisiones•Actualización de variables del juego y jugadores

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 35: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

MOVIMIENTOS DE OBJETOS

•Mover objetos y enemigos•Rotación de objetos y enemigos•Actualizar estado de los objetos

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 36: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

MOVIMIENTOS DE JUGADORES

•Procesar variables de cada jugador(movimiento, vidas, energía, etc.)

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 37: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

MUSICA Y SONIDO

•Actualizar variables de efectos de sonido•Iniciar, parar, terminar efectos de música

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 38: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

Renderización

RENDERIZACION

•Dibujar los objetos a partir de modelos, sprites, etc.

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 39: Programación Aplicada - Tema 2

Lógica de Comportamien

toMovimientos de objetos

Movimientos de jugadores

Música y Sonido

RenderizaciónACCIONES POST-JUEGO

Comprobaciones del estado del juego: si hay pausa, animación, finalización del juego, etc.

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 40: Programación Aplicada - Tema 2

3. Estructura de un videojuego.E. Secuencia de Estados de un VIDEOJUEGO.

FN JUGAR

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 41: Programación Aplicada - Tema 2

4. Bucle del Juego y Gestión del Tiempo.

Game_Init()

Game_Update()

Game_Render()

Game_Deinit()

CICLO DE EJECUCION

Frame

Duración estándar: 0.016s -> 60 fps

Duración Superior a 0.032 -> 30 fps

SE PIERDE LA ILUSION DE ANIMACION

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 42: Programación Aplicada - Tema 2

4. Bucle del Juego y Gestión del Tiempo.

Duración Frames

Características

de las computado

ras

determinan

Fórmula: Espacio = Velocidad * Tiempo

Se debe medir el tiempo que ha transcurrido desde la ultima ejecución del UPDATE() y mover los objetos en el juego una distancia proporcional al tiempo transcurrido.

Solución

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 43: Programación Aplicada - Tema 2

4. Bucle del Juego y Gestión del Tiempo.1- Incluir en el fichero de cabeceras: windows.h

2- Enlazar el proyecto con la librería winmm.lib

3- Modificar el main()…int liLastTime = timeGetTime();int liActualTime;float lfTimeStep;while ( ! Game_HasFinish( & sGAME) ){

liActualTime= timeGetTime();lfTimeStep = (float)(liActualTime-liLastTime)/1000.0;liLastTime=liActualTime;

Game_Update(& sGAME, lfTimeStep);Game_Render(& sGAME);

}…

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 44: Programación Aplicada - Tema 2

5. Gestor de los dispositivos de entrada.

Tipos de control de entrada

1.Orientada a Eventos: Cada vez que el estado del dispositivo cambia, la librería lo notifica en forma de un evento.

2.Por Encuesta: Nuestro juego pregunta cada cierto tiempo sobre el estado del dispositivo.

Tipos de dispositivos de entrada

Teclado, Ratón, Joystick, etc.

Desarrollo de Desarrollo de videojuegosvideojuegos

Page 45: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Librería portable diseñada para la programación aplicada a videojuegos y multimedia, originalmente desarrollada por Shawn Hargreaves empleando una mezcla entre el lenguaje C y assembler.

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Page 46: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Page 47: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

int main(){

allegro_init();

install_keyboard();

set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);

textout_ex(screen, font, "Hola, divertido mundo!", 230, 240, makecol(255, 0, 0), makecol(0, 0, 0));

readkey();

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

¡Hola mundo!1- Inicialización de Allegro y preparación del teclado.

2- Cambio de resolución de la pantalla.

3- Presentación de un mensaje.

Page 48: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

int x = 10;

int y = 10;

int main(){

allegro_init();

install_keyboard();

set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);

while(!key[KEY_ESC]){

// BUCLE PRINCIPAL DEL JUEGO.

}

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del TiempoEntrada y Salida1- Arreglo de etiquetas key.

2- Limpiar el caché del teclado.

3- Preparar y liberar el procesamiento en la pantalla.

4- Pausar la ejecución del hilo actual.

Page 49: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

while(!key[KEY_ESC]){

clear_keybuf();

acquire_screen();

textout_ex(screen, font, " ", x, y, makecol(0, 0, 0), makecol(0, 0, 0));

if(key[KEY_UP]) --y;

else if(key[KEY_DOWN]) ++y;

else if (key[KEY_RIGHT]) ++x;

else if (key[KEY_LEFT]) --x;

textout_ex(screen, font, "@", x, y, makecol(255, 0, 0), makecol(0, 0, 0));

release_screen();

rest(50);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del TiempoEntrada y Salida1- Arreglo de etiquetas key.

2- Limpiar el caché del teclado.

3- Preparar y liberar el procesamiento en la pantalla.

4- Pausar la ejecución del hilo actual.

Page 50: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

KEY_A - KEY_Z, KEY_0 - KEY_9, KEY_0_PAD - KEY_9_PAD, KEY_F1 - KEY_F12,

KEY_ESC, KEY_TILDE, KEY_MINUS, KEY_EQUALS, KEY_BACKSPACE, KEY_TAB, KEY_OPENBRACE, KEY_CLOSEBRACE, KEY_ENTER, KEY_COLON, KEY_QUOTE, KEY_BACKSLASH, KEY_BACKSLASH2, KEY_COMMA, KEY_STOP, KEY_SLASH, KEY_SPACE,

KEY_INSERT, KEY_DEL, KEY_HOME, KEY_END, KEY_PGUP, KEY_PGDN, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN,

KEY_SLASH_PAD, KEY_ASTERISK, KEY_MINUS_PAD, KEY_PLUS_PAD, KEY_DEL_PAD, KEY_ENTER_PAD,

KEY_PRTSCR, KEY_PAUSE,

KEY_ABNT_C1, KEY_YEN, KEY_KANA, KEY_CONVERT, KEY_NOCONVERT, KEY_AT, KEY_CIRCUMFLEX, KEY_COLON2, KEY_KANJI,

KEY_LSHIFT, KEY_RSHIFT, KEY_LCONTROL, KEY_RCONTROL, KEY_ALT, KEY_ALTGR, KEY_LWIN, KEY_RWIN, KEY_MENU, KEY_SCRLOCK, KEY_NUMLOCK, KEY_CAPSLOCK

KEY_EQUALS_PAD, KEY_BACKQUOTE, KEY_SEMICOLON, KEY_COMMAND

Page 51: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

int main()

{

allegro_init();

install_keyboard();

set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);

acquire_screen();

clear_to_color(screen, makecol(255, 255, 255));

putpixel(screen, 5, 5, makecol(128, 200, 23));

circle(screen, 20, 20, 10, makecol(255, 0, 0));

circlefill(screen, 50, 50, 25, makecol(0, 255, 0));

rect(screen, 70, 70, 90, 90, makecol(0, 0, 255));

rectfill(screen, 100, 100, 120, 120, makecol(12, 34, 200));

line(screen, 130, 130, 150, 150, makecol(255, 0, 0));

line(screen, 130, 130, 170, 130, makecol(255, 0, 0));

line(screen, 170, 130, 150, 150, makecol(255, 0, 0));

floodfill(screen, 140, 135, makecol(213, 79, 40));

triangle(screen, 200, 200, 200, 220, 220, 210, makecol(213, 79, 40));

release_screen();

readkey();

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del TiempoFiguras Geométricas1- Resetear color.

2- Funciones para dibujar: Píxeles, círculos, rectángulos, líneas y triángulos.

3- Funciones para rellenar de color y dibujar figuras coloreadas.

Page 52: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

BITMAP *xSprite;

BITMAP *oSprite;

int main()

{

allegro_init();

install_keyboard();

set_color_depth(16);

set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);

xSprite = load_bitmap("x.bmp", NULL);

oSprite = load_bitmap("o.bmp", NULL);

acquire_screen();

// AQUÍ IRÍAN LAS FUNCIONES PARA DIBUJAR.

release_screen();

readkey();

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del TiempoSprites1- Capturar los archivos BMP de entrada.

2- Punteros a Bitmap.

3- Cambiar la densidad de colores.

4- Cargar imágenes BMP en la pantalla.

5- Dibujar Sprites.

Page 53: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

line(screen, 200, 0, 200, 480, makecol(255, 255, 255));

line(screen, 400, 0, 400, 480, makecol(255, 255, 255));

line(screen, 0, 150, 680, 150, makecol(255, 255, 255));

line(screen, 0, 300, 680, 300, makecol(255, 255, 255));

draw_sprite(screen, xSprite, 0, 0);

draw_sprite(screen, oSprite, 200, 0);

draw_sprite(screen, xSprite, 400, 0);

draw_sprite(screen, oSprite, 0, 150);

draw_sprite(screen, xSprite, 200, 150);

draw_sprite(screen, oSprite, 400, 150);

draw_sprite(screen, oSprite, 0, 300);

draw_sprite(screen, xSprite, 200, 300);

draw_sprite(screen, oSprite, 400, 300);

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del TiempoSprites1- Capturar los archivos BMP de entrada.

2- Punteros a Bitmap.

3- Cambiar la densidad de colores.

4- Cargar imágenes BMP en la pantalla.

5- Dibujar Sprites.

Page 54: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

#include <cstdlib>

int x = 100;

int y = 100;

int tempX = 100;

int tempY = 100;

int dir = 1; // Esto es para identificar la dirección de los círculos.

// 1: arriba a la izquierda, 2: abajo a la izquierda,

// 3: arriba a la derecha, 4: abajo a la derecha.

void moverCirculo();

int main()

{

allegro_init();

install_keyboard();

set_color_depth(16);

set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);

while(!key[KEY_ESC])

{

moverCirculo();

}

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Animaciones1- Uso de funciones con Allegro.

2- Uso del concepto de aleatoriedad.

3- Pestañeos.

Page 55: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

void moverCirculo()

{

tempX = x;

tempY = y;

if(dir == 1 && x != 20 && y != 20) {

--x;

--y;

}

else if (dir == 2 && x != 20 && y != 460){

--x;

++y;

}

else if (dir == 3 && x != 620 && y != 20){

++x;

--y;

}

else if (dir == 4 && x != 620 && y != 460){

++x;

++y;

}

else{

dir = rand() % 4 + 1;

}

acquire_screen();

circlefill(screen, tempX, tempY, 20, makecol(0, 0, 0));

circlefill(screen, x, y, 20, makecol(128, 255, 0));

release_screen();

rest(10);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Animaciones1- Uso de funciones con Allegro.

2- Uso del concepto de aleatoriedad.

3- Pestañeos.

Page 56: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

#include <cstdlib>

int x = 100;

int y = 100;

int tempX = 100;

int tempY = 100;

int dir = 1; // Esto es para identificar la dirección de los círculos.

// 1: arriba a la izquierda, 2: abajo a la izquierda,

// 3: arriba a la derecha, 4: abajo a la derecha.

BITMAP *buffer; // Caché temporal para usarlo como el Bitmap principal (double buffer);

void moverCirculo();

int main(){

allegro_init();

install_keyboard();

set_color_depth(16);

set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);

buffer = create_bitmap(640, 480);

while(!key[KEY_ESC])

moverCirculo();

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Animaciones1- Aplicación del concepto “Double Filtering” (filtrado doble).

Page 57: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

void moverCirculo()

{

tempX = x;

tempY = y;

if(dir == 1 && x != 20 && y != 20){

--x;

--y;

}

else if (dir == 2 && x != 20 && y != 460){

--x;

++y;

}

else if (dir == 3 && x != 620 && y != 20){

++x;

--y;

}

else if (dir == 4 && x != 620 && y != 460){

++x;

++y;

}

else{

dir = rand() % 4 + 1;

}

acquire_screen();

circlefill(buffer, tempX, tempY, 20, makecol(0, 0, 0));

circlefill(buffer, x, y, 20, makecol(128, 255, 0));

draw_sprite(screen, buffer, 0, 0);

release_screen();

rest(10);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Animaciones1- Aplicación del concepto “Double Filtering” (filtrado doble).

Page 58: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

if (xmin1 < xmax2 && ymin1 < ymax2 && xmin2 < xmax1 && ymin2 < ymax1) {

/* Colisionan los objetos */

}

Detección de ColisionesDetección de Colisiones

Colisiones estilo “caja”

Page 59: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

BITMAP* caja;

BITMAP* buffer;

// Estas variables son para tener la posición del jugador.

// En vez de usar píxeles, usaremos la posición del arreglo 2D.

int x = 15;

int y = 11;

int tempX = 15;

int tempY = 11;

// Esta variable es para saber la cantidad de cajas fuera de los hoyos.

int cajas;

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 60: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

// Este será la matriz para el fondo. 1 = nubes, 2 = ladrillos, 3 = piso, 4 = hoyo.

int mapa[24][32] = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,4,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 61: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

// Esta matriz es para guardar todos los objetos. 100 = jugador, 101 = caja

int objMap[24][32] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,101,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 62: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

void init_juego(){

buffer = create_bitmap( 640, 480);

caja = load_bitmap( "box.bmp", NULL);

cajas = 1;

for (int i = 0; i <= 24; i++){

for( int t = 0; t <= 32; t++){

if( mapa[i][t] == 1) rectfill( buffer, t * 20, i * 20, (t + 1) * 20, (i + 1) * 20, makecol( 128, 255, 255));

else if( mapa[i][t] == 2) rectfill( buffer, t * 20, i * 20, (t + 1) * 20, (i + 1) * 20, makecol( 255, 128, 0));

else if( mapa[i][t] == 3) rectfill( buffer, t * 20, i * 20, (t + 1) * 20, (i + 1) * 20, makecol( 255, 0, 0));

else if( mapa[i][t] == 4) rectfill( buffer, t * 20, i * 20, (t + 1) * 20, (i + 1) * 20, makecol( 0, 0, 0));

}

}

for (int i = 0; i <= 24; i++){

for( int t = 0; t <= 32; t++){

if( objMap[i][t] == 100) circlefill( buffer, (t * 20) + 10, (i * 20) + 10, 10, makecol( 255, 255, 0));

else if( objMap[i][t] == 101) draw_sprite( buffer, caja, t * 20, i * 20);

}

}

draw_sprite( screen, buffer, 0, 0);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 63: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

void moverJugador(){

tempX = x;

tempY = y;

if ( key[KEY_UP] && mapa[y - 1][x] == 3){

if( objMap[y - 1][x] != 101){

--y;

} else if( objMap[y - 1][x] == 101 && mapa[y - 2][x] == 3 || objMap[y - 1][x] == 101 && mapa[y - 2][x] == 4){

if (mapa[y - 2][x] == 4) --cajas;

objMap[y - 2][x] = 101;

draw_sprite( buffer, caja, x * 20, (y - 2) *20);

--y;

}

} else if ( key[KEY_DOWN] && mapa[y + 1][x] == 3){

if( objMap[y + 1][x] != 101){

++y;

} else if( objMap[y + 1][x] == 101 && mapa[y + 2][x] == 3 || objMap[y + 1][x] == 101 && mapa[y + 2][x] == 4){

if (mapa[y + 2][x] == 4) --cajas;

objMap[y + 2][x] = 101;

draw_sprite( buffer, caja, x * 20, (y + 2) *20);

++y;

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 64: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

} else if ( key[KEY_RIGHT] && mapa[y][x + 1] == 3){

if( objMap[y][x + 1] != 101){

++x;

} else if( objMap[y][x + 1] == 101 && mapa[y][x + 2] == 3 || objMap[y][x + 1] == 101 && mapa[y][x + 2] == 4){

if (mapa[y][x + 2] == 4) --cajas;

objMap[y][x + 2] = 101;

draw_sprite( buffer, caja, (x + 2) * 20, y * 20);

++x;

}

} else if ( key[KEY_LEFT] && mapa[y][x - 1] == 3){

if( objMap[y][x - 1] != 101){

--x;

} else if( objMap[y][x - 1] == 101 && mapa[y][x - 2] == 3 || objMap[y][x - 1] == 101 && mapa[y][x - 2] == 4){

if (mapa[y][x - 2] == 4) --cajas;

objMap[y][x - 2] = 101;

draw_sprite( buffer, caja, (x - 2) * 20, y * 20);

--x;

}

}

acquire_screen();

rectfill( buffer, tempX * 20, tempY * 20, (tempX + 1) * 20, (tempY + 1) * 20, makecol( 255, 0, 0));

circlefill( buffer, (x * 20) + 10, (y * 20) + 10, 10, makecol( 255, 255, 0));

draw_sprite( screen, buffer, 0, 0);

release_screen();

objMap[tempY][tempX] = 0;

objMap[y][x] = 101;

if ( !cajas){

textout_ex( screen, font, "You Win!!!", 320, 240, makecol(0, 0, 255), makecol(0, 0, 0));

}

rest(100);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 65: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

} else if ( key[KEY_LEFT] && mapa[y][x - 1] == 3){

if( objMap[y][x - 1] != 101){

--x;

} else if( objMap[y][x - 1] == 101 && mapa[y][x - 2] == 3 || objMap[y][x - 1] == 101 && mapa[y][x - 2] == 4){

if (mapa[y][x - 2] == 4) --cajas;

objMap[y][x - 2] = 101;

draw_sprite( buffer, caja, (x - 2) * 20, y * 20);

--x;

}

}

acquire_screen();

rectfill( buffer, tempX * 20, tempY * 20, (tempX + 1) * 20, (tempY + 1) * 20, makecol( 255, 0, 0));

circlefill( buffer, (x * 20) + 10, (y * 20) + 10, 10, makecol( 255, 255, 0));

draw_sprite( screen, buffer, 0, 0);

release_screen();

objMap[tempY][tempX] = 0;

objMap[y][x] = 101;

if ( !cajas){

textout_ex( screen, font, "You Win!!!", 320, 240, makecol(0, 0, 255), makecol(0, 0, 0));

}

rest(100);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 66: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

int main(){

allegro_init();

install_keyboard();

set_color_depth(16);

set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);

init_juego();

while( !key[KEY_ESC]){

moverJugador();

}

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Fondos1- Técnica para gestionar fondos de pantalla.

Page 67: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

BITMAP* buffer;

int cursor_x = 20;

int cursor_y = 20;

void getMouseInfo(){

if(mouse_b & 1){

cursor_x = mouse_x;

cursor_y = mouse_y;

}

}

void updateScreen(){

circlefill ( buffer, cursor_x, cursor_y, 20, makecol( 0, 0, 255));

draw_sprite( screen, buffer, 0, 0);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Mouse

Page 68: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

int main(){

allegro_init();

install_mouse();

install_keyboard();

set_color_depth(16);

set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);

buffer = create_bitmap( 640, 480);

show_mouse(buffer);

while( !key[KEY_ESC]){

getMouseInfo();

updateScreen();

}

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Mouse

Page 69: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

BITMAP* buffer;

int cursor_x = 20;

int cursor_y = 20;

int getMouseInfo(){

if(mouse_b & 1){

cursor_x = mouse_x;

cursor_y = mouse_y;

return 1;

}

return 0;

}

void updateScreen(){

show_mouse(NULL);

circlefill ( buffer, cursor_x, cursor_y, 5, makecol( 0, 0, 255));

draw_sprite( screen, buffer, 0, 0);

}

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Mouse

Page 70: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

int main(){

allegro_init();

install_mouse();

install_keyboard();

set_color_depth(16);

set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);

buffer = create_bitmap( 640, 480);

show_mouse(screen);

while( !key[KEY_ESC])

{

int switcher=1;

while(getMouseInfo())

{

updateScreen();

if(getMouseInfo()==0) switcher=0;

}

if(switcher==0) show_mouse(screen);

}

return 0;

}

END_OF_MAIN();

Bucle del Juego y Gestión del TiempoBucle del Juego y Gestión del Tiempo

Mouse

Page 71: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Origen: 1992, por Mark Segal y Kurt Akeley.

Es una especificación estándar multi-lenguaje y multi-plataformas para desarrollar aplicaciones que produzcan gráficos de computadoras en 2D y 3D escrito en el lenguaje C.

La interface consiste en más de 250 llamadas de funciones distintas que pueden ser usadas para dibujar escenas tridimensionales complejas partiendo de sencillos recursos.

Conociendo la especificación OpenGLConociendo la especificación OpenGL

Page 72: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

En los años 1980’s era todo un desafío desarrollar software que aprovechara la diversidad de hardware gráfico. Resultaba muy costoso y había mucha duplicidad de esfuerzos.

A principios de los años 1990’s, Silicon Graphics con su API IRIS GL eran los líderes en gráficos para Workstations, debido a su facilidad de implementación y renderizado inmediato (no usando double-buffering) el cual permitía a los programadores un mayor control de la pantalla.

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 73: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Sin embargo, ya empezaba a surgir una serie de competidores (Sun Microsystems, Hewlett-Packard e IBM) con otros hardware en 3D empleando el otro estandar disponible en la fecha, llamado PHIGS.

Frente a esto, SGI tomó la iniciativa de convertir el API IRIS GL a código abierto (OpenGL) para romper las barreras del licenciamiento y patentes y permitir a más desarrolladores y fabricantes de Hardware 3D explotar los potenciales de esta API.

Esto resultó exitoso, hasta el 1995 cuando Microsoft lanzó Direct3D, principal competidor de OpenGL.

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 74: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Sin embargo, ya empezaba a surgir una serie de competidores (Sun Microsystems, Hewlett-Packard e IBM) con otros hardware en 3D empleando el otro estandar disponible en la fecha, llamado PHIGS.

Frente a esto, SGI tomó la iniciativa de convertir el API IRIS GL a código abierto (OpenGL) para romper las barreras del licenciamiento y patentes y permitir a más desarrolladores y fabricantes de Hardware 3D explotar los potenciales de esta API.

Esto resultó exitoso, hasta el 1995 cuando Microsoft lanzó Direct3D, principal competidor de OpenGL.

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 75: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

El 17 de diciember del 1997, Microsoft y SGI iniciaron el proyecto Fahrenheit, con el propósito de unificar OpenGL con las interfaces de Direct3D.

Poco tiempo después, en el 1998, Hewlett-Packard se une al proyecto y todo aparentaba resultar en un aliento por traer el orden en el mundo de las API’s gráficas de la computación 3D.

Lamentablemente en el 1999 es abandonado el proyecto debido a restricciones económicas de SGI, razones estratégicas de Microsoft y la falta de soporte de parte de la industria.

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 76: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 77: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 78: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Conociendo la especificación OpenGL - Conociendo la especificación OpenGL - HistoriaHistoria

Page 79: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Algunos Famosos Juegos que Emplean Algunos Famosos Juegos que Emplean OpenGLOpenGL

Arkanoid: Space Ball Call of Duty CommandosCounter-Strike Darwinia Deus ExDoom 3 Doom 4 Far CryHalf-Life Half-Life 2 Heretic IIHitman Max Payne Quake (todas las series)Return to Castle Wolfenstein Second Life SporeStarCraft II Tux Racer Unreal TournamentUnreal Tournament 2004 Warcraft 3 WolfensteinWorld of Warcraft

Page 80: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Permite sacar provecho a la renderización de aceleración gráfica en el hardware aplicando principalmente la versión 4.x del API de Allegro.

El API de Allegro puede usar comandos OpenGL para ejecutar el renderizado en la pantalla y mapas de bits. Se requiere instalar el AllegroGL junto con el API de Allegro, pero no exige de ningún conocimiento sobre OpenGL.

Allegro con Aceleración de Hardware Allegro con Aceleración de Hardware (AllegroGL)(AllegroGL)

Page 81: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Para poder sacarle el provecho a AllegroGL es necesario tener la implementación de OpenGL en el computador, lo cual consiste en tener una tarjeta gráfica compatible con OpenGL y unos controladores (drivers) actualizados.

AllegroGL - RequerimientosAllegroGL - Requerimientos

Page 82: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Allegro 4.2.1 o mayor + AllegroGL 0.4.2 o mayor:

AllegroGL se puede descargar como un paquete por separado para ser instalado después de instalar el Allegro.

Allegro 4.4.x con AllegroGL habilitado:

Antes de la salida oficial de Allegro 5, esta es la versión de Allegro más estable actualmente disponible. Contiene las librerías de AllegroGL dentro del paquete.

AllegroGL - RequerimientosAllegroGL - Requerimientos

Page 83: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

#include <allegro.h>

#include <alleggl.h>

int main() {

if (allegro_init() != 0) {

return 1;

}

if (install_allegro_gl() != 0) {

return 1;

}

install_keyboard();

install_timer();

allegro_gl_set(AGL_DOUBLEBUFFER, 1);

allegro_gl_set(AGL_WINDOWED, TRUE);

allegro_gl_set(AGL_COLOR_DEPTH, 32);

allegro_gl_set(AGL_SUGGEST, AGL_DOUBLEBUFFER | AGL_WINDOWED | AGL_COLOR_DEPTH);

if(set_gfx_mode(GFX_OPENGL, 800, 600, 0, 0)) {

allegro_message ("Error al configurar el modo grafico de OpenGL:\n%s\n"

“Error de Allegro GL: %s\n",

allegro_error, allegro_gl_error);

exit(0);

}

allegro_gl_set_allegro_mode();

textout_ex(screen, font, “Hola Mundo!", 50, 100, makecol(255, 0, 0), -1);

allegro_gl_unset_allegro_mode();

allegro_gl_flip();

readkey();

return 0;

}

END_OF_MAIN()

AllegroGL – “Hola Mundo” AllegroGL – “Hola Mundo” Tomado Tomado desde allegro.ccdesde allegro.cc

Page 84: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

Todas las funciones que están anteriores al textout_ex() son parte del código que siempre se encuentra en cualquier tutorial de AllegroGL.

Realizan la siguiente configuración: en modo de ventana, double-buffered y modo GFX de 32 bits.

El código debajo del allegro_gl_flip se encarga de intercambiar el buffer con la pantalla (ya que estamos usando el double-filtering) y luego espera que se presione una tecla.

AllegroGL – “Hola Mundo” AllegroGL – “Hola Mundo” Funciones Funciones UsadasUsadas

Page 85: Programación Aplicada - Tema 2

DESARROLLO DE VIDEOJUEGOS

No importa qué tan complicado vaya a ser el videojuego, estas líneas de código de configuración serán necesarias para emplear la especificación OpenGL.

textout_ex() es una función típica del API de allegro, sólo que hemos configurado para utilizar los comandos de OpenGL.

Cualquier función de Allegro que utilicemos entre allegro_gl_set_allegro_mode() y allegro_gl_unset_allegro_mode() que dibuje en un mapa de bits (BITMAP*) o en la pantalla utilizará los comandos de OpenGL para renderizado.

AllegroGL – “Hola Mundo” AllegroGL – “Hola Mundo” Funciones Funciones UsadasUsadas