/* JUEGO DE LA VIBORA - SE HACE USO DE LA LIBRERIA OPEN_GL COMPILAR: gcc -o VIB_OPENGL VIB_OPENGL.c -lGL -lGLU -lglut EJECUTAR: ./Vibora */ #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> #include <math.h> #include <string.h> #define PI 3.1415926535897932 void Vibora(void); void Dibuja(void); void Flechas(int, int, int); void Inicializa(void); void CalculaBotana( ); int Vx=100, Vy=100; // posiciOn de la viborilla int Radio = 10, LimX=800, LimY=500, First = 1; int PosBotanaX[10], PosBotanaY[10]; void CalculaBotana( ) { int k = 0, x=0, y=0; for(k=0; k < 10; k++) { srand(time (NULL)); x=rand() %(LimX -(k*k*k)); if (x < 0) x = -1*x; if (x > LimX) x = x - rand() %LimX; y=rand() %LimY -(k*k*k); if (y < 0) y = -1*y; if (y > LimY) y = y - rand() %LimY; PosBotanaX[k] = x; PosBotanaY[k] = y; glPushMatrix(); glTranslatef(PosBotanaX[k], PosBotanaY[k], 0.0f); glColor3f(1,1,1); glutWireSphere(Radio, 50, 50); glPopMatrix(); printf("X= %d\tY= %d\n", x, y); } } void PintaBotana( ) { int k=0; for(k=0; k < 10; k++) { glPushMatrix(); glTranslatef(PosBotanaX[k], PosBotanaY[k], 0.0f); glColor3f(1,1,1); glutWireSphere(Radio, 50, 50); glPopMatrix(); } } void Chocaste( ) { int k=0; for(k=0; k < 10; k++) { /* if ( Vx + Radio >= PosBotanaX[k] - Radio && Vx + Radio <= PosBotanaX[k] + Radio && // IZQ a DER Vx - Radio <= PosBotanaX[k] + Radio && Vx - Radio <= PosBotanaX[k] - Radio) // DER a IZQ */ if ( Vy - Radio <= PosBotanaY[k] + Radio && Vy - Radio >= PosBotanaY[k] + Radio && // ARR a ABA Vy + Radio >= PosBotanaY[k] - Radio && Vy + Radio <= PosBotanaY[k] + Radio) // ABA a ARR printf("SI CHOQUE... \n"); } } void Vibora( ) { /* int i=0; double Angulo = 0.0; GLint NPuntos = 100; // puntos en la circunferencia double Radio = 100; glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for (i = 0; i < NPuntos; i++) { Angulo = 2*PI*i/NPuntos; glVertex2f(Vx+Radio*cos(Angulo), Vy+Radio*sin(Angulo)); } glEnd(); */ glPushMatrix(); glTranslatef(Vx, Vy, 0.0f); glColor3f(1,1,0); glutWireSphere(Radio, 50, 50); glPopMatrix(); } void Dibuja(void) { glClearColor (0.0, 0.0, 0.0, 0.0); /* Fondo negro en la ventana */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* (1 de 3) borra la pantalla e inicializa el Z-Buffer */ glMatrixMode(GL_PROJECTION); /* Modo proyecciOn */ glLoadIdentity(); /* Se carga la matriz identidad */ glOrtho(0.0, 1000.0, 0.0, 600.0, -1.0, 1.0); /* ProyecciOn ortogrAfica (izq, der, abajo, arriba, cerca z , lejos -z) */ glMatrixMode(GL_MODELVIEW); /* Modo de modelado */ //glBegin(GL_LINES); glColor3f(1,1,0); glVertex3f(0, 0, 0); glVertex3f(LimX, LimY, 0); glEnd( ); Vibora( ); if (First) { CalculaBotana( ); First = 0; } else { PintaBotana(); } glFlush (); } void Flechas(int Tecla, int x, int y) { switch (Tecla) { case GLUT_KEY_UP: { Vy = Vy + 5; if (Vy > LimY) Vy = LimY; break; } case GLUT_KEY_DOWN: { Vy = Vy - 5; if (Vy < Radio) Vy = Radio; break; } case GLUT_KEY_RIGHT: { Vx = Vx + 5; if (Vx > LimX) Vx = LimX; break; } case GLUT_KEY_LEFT: { Vx = Vx - 5; if (Vx < Radio) Vx = Radio; break; } } //printf("X= %d\t Y= %d\n", Vx, Vy); Chocaste( ); glutPostRedisplay(); } void Inicializa() { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1000.0, 0.0, 600.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); // INICIALIZA EL MODO GRAFICO glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); /* (3 de 3) Se reserva espacio para el Z-Buffer */ glutInitWindowSize (LimX, LimY); /* Ancho y alto de la ventana */ glutInitWindowPosition (200, 100); glutCreateWindow ("___ VIBORA ___"); Inicializa(); glutDisplayFunc(Dibuja); glutSpecialFunc(Flechas); // DETECTA LAS TECLAS DE FLECHAS glutMainLoop(); return 0; }