/* 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;
}