Upload
alexis-hurtado
View
218
Download
0
Embed Size (px)
Citation preview
Colegio de educación profesional técnica del estado de Veracruz. Plante #165 Lic. Jesús
Reyes HerolesModulo: Programación De VideojuegosDocente: Miguel Ángel Ramos Grande
Alumno: Manuel Alexis Hurtado Morales.
Carrera: Informática
Grupo: 604 infoMatrícula: 111650246-7
Práctica 11:Aplicación de matemáticas para Juego: Tiro Al
Plato. Usando lenguaje de programaciónPropósito de la práctica:
Elabora una aplicación de videojuego de Tiro Al plato usando lenguaje de programación para la
aplicación de conceptos de geometría plana.Dirección del blog:
http://programaciondevideojuegosalexis.blogspot.mx/
En esta práctica realizaremos un juego de tiro al plato, el cual consiste de un paisaje en el cual se van tirando platos y con el mouse vamos rompiendo los mismo y vamos ganando puntos.Comenzamos declarando las librerías a utilizar ya que son importantes en el videojuego.
#include <stdlib.h> // Para declarar lo que es el "rand"
#include <math.h> // Para declarar lo que es el "sqrt"#include <allegro.h> Definimos las constantes globales.#define ANCHOPANTALLA 320#define ALTOPANTALLA 200#define MAXRADIODIANA 25#define MINRADIODIANA 5#define NUMDIANAS 12#define MAXINCREMXDIANA 20#define MININCREMXDIANA 10#define RETARDO 7
Definimos las variables Globales.int TamanyoDianaActual, numDianaActual, posXdiana, posYdiana, radioDiana, incremXdiana, incremYdiana, acertado = 0; // Si atinamos a un plato, pasa otro plato nuevo. long int puntos = 0, contadorActual = 0; float a,b,c; // Se dibuja la parábola del plato. /* -------------- Se empieza con la Rutina de inicialización -------- */int inicializa(){ allegro_init(); // Se inicia Allegro install_keyboard(); install_timer(); install_mouse(); // Intentamos entrar a modo grafico if (set_gfx_mode(GFX_SAFE, ANCHOPANTALLA, ALTOPANTALLA, 0, 0) != 0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message( "Incapaz de entrar a modo grafico\n%s\n", allegro_error); return 1; } // Ahora se inicializan las variables numDianaActual = 1; srand(time(0)); show_mouse(screen);
// Y termino indicando que no ha habido errores return 0;} /* -------------- Rutina de nuevo plato ----------- */void nuevoPlato(){ int xVerticeParabola, yVerticeParabola; float pParabola; // Un radio al azar entre el valor máximo y el mínimo radioDiana = (rand() % (MAXRADIODIANA - MINRADIODIANA)) + MINRADIODIANA; // La velocidad (incremento de X), similar incremXdiana = (rand() % (MAXINCREMXDIANA - MININCREMXDIANA)) + MININCREMXDIANA; // Vértice de la parábola, cerca del centro en horizontal xVerticeParabola = ANCHOPANTALLA/2 + (rand() % 40) - 20; // Y mitad superior de la pantalla, en vertical yVerticeParabola = (rand() % (ALTOPANTALLA/2)); // Calculo a, b y c de la parábola pParabola = ALTOPANTALLA/2; a = 1 / (2*pParabola); b = -xVerticeParabola / pParabola; c = ((xVerticeParabola*xVerticeParabola) / (2*pParabola) ) + yVerticeParabola; // Posición horizontal: junto margen izquierdo posXdiana = radioDiana; // Posición vertical: según la parábola posYdiana = a*posXdiana*posXdiana + b*posXdiana + c; } /* -------------- Rutina de redibujar pantalla ---- */void redibujaPantalla(){ // Oculto ratón scare_mouse(); // Borro pantalla clear_bitmap(screen); // Sincronizo con barrido para menos parpadeos vsync();
// Y dibujo todo lo que corresponda rectfill(screen,0,0,ANCHOPANTALLA,ALTOPANTALLA-40, makecol(70, 70, 255)); //Cielo textprintf(screen, font, 4,4, palette_color[13], "Puntos: %d", puntos); // Puntuación rectfill(screen,0,ALTOPANTALLA-40,ANCHOPANTALLA,ALTOPANTALLA, makecol(0, 150, 0)); //Suelo circlefill(screen, posXdiana, posYdiana, radioDiana, palette_color[15]); // Diana if (numDianaActual <= NUMDIANAS) { textprintf(screen, font, 4,190, palette_color[13], "Platos: %d", NUMDIANAS-numDianaActual); } unscare_mouse();} /* -------------- Distancia entre dos puntos ------ */float distancia(int x1, int x2, int y1, int y2) { return (sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) );}/* -------------- Rutinas de temporización ---- */volatile long int contador = 0; void aumentaContador(void) { contador++; }END_OF_FUNCTION(aumentaContador);
/* -------------- Cuerpo del programa ------------- */ int main(){ // Intentamos inicializar if (inicializa() != 0) exit(1); // Bloqueamos la variable y la función del temporizador LOCK_VARIABLE( contador ); LOCK_FUNCTION( aumentaContador ); // Y ponemos el temporizador en marcha: cada 10 milisegundos install_int(aumentaContador, 10); do { // Parte que se repite para cada plato nuevoPlato(); // Calculo su posición inicial redibujaPantalla(); // Y dibujo la pantalla acertado = 0; // Todavía no se ha acertado, claro
do { // Parte que se repite mientras se mueve // Compruebo el mouse if (mouse_b & 1) { if (distancia(mouse_x, posXdiana, mouse_y,posYdiana) <= radioDiana) { puntos += ANCHOPANTALLA-posXdiana; acertado = 1; } } // Si ya ha pasado el retardo, muevo if (contador >= contadorActual+RETARDO) { contadorActual = contador+RETARDO; posXdiana += incremXdiana; posYdiana = a*posXdiana*posXdiana + b*posXdiana + c; redibujaPantalla(); } } while ((posXdiana <= ANCHOPANTALLA - radioDiana) && (acertado == 0)); numDianaActual ++; } while (numDianaActual <= NUMDIANAS); redibujaPantalla(); scare_mouse(); textprintf(screen, font, 40,100, palette_color[15], "Partida terminada"); unscare_mouse(); readkey(); return 0; }END_OF_MAIN() Aquí termina Allegro.
Programa compilado Aquí se muestran los puntos que llevamos acumulados.
Conclusión: En esta práctica realizamos un videojuego con el uso del mouse ya que al dar clic en el plato este se rompe y pasa otro plato y se acumulan puntos, tuvimos que conocer e investigar más comandos, y definimos constantes.
Plato
Indica que nuestra partida ha terminado