VIB_OPENGL.c



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