domingo, 23 de marzo de 2014

Práctica.- Francotirador

Esta práctica puede expresarse como una base para desarrollar algún tipo de juego de disparos.
Su objetivo principal es mostrar una marca en algún lugar de la pantalla, sobre la cual, al presionar un tecla se puede dibujar alguna imagen.

El funcionamiento es básicamente con el teclado, aunque también pudiera implementarse con el mouse con una de las prácticas que también se encuentran en este blog. El código utilizado es el siguiente:
---------------------------------------------------------------------------------------------------
/*Sáenz Morales Carlos Giovanni

*/

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>

using namespace std;
float valor_x=0.0;
float valor_y=0.0;
float vx[10000];
float vy[10000];
int con=0;
double tama=0.02;

void circulo(){
     for(int i=0;i<con;i++)
            {
                glPushMatrix();
                glColor3f(1.0,1.0,1.0);
                glTranslatef(vx[i],vy[i],0.0);
                glutSolidSphere(tama,20,20);
                glFlush();
                glPopMatrix();
            }
}

void Dibuja(){
    cerr << "Dibuja() \n";
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


    glPushMatrix();
    glBegin(GL_LINES);
    glColor3f(1.0,1.0,1.0);
    glVertex2f(valor_x+0.1,valor_y);
    glVertex2f(valor_x-0.1,valor_y);
    glVertex2f(valor_x,valor_y+0.1);
    glVertex2f(valor_x,valor_y-0.1w);
    glEnd();
    circulo();
    glFlush();
    //glPopMatrix();
}

void keyInput(unsigned char key,int x, int y){
    switch(key){
        case 27:
        case 'a':
            vx[con]=valor_x;
            vy[con]=valor_y;
            con++;
            //for(int i=0;i<con;i++)
            //{
              //  glPushMatrix();
               // glColor3f(1.0,1.0,1.0);
               // glTranslatef(vx[i],vy[i],0.0);
               // glutSolidSphere(tama,20,20);
               // glFlush();
               // glPopMatrix();
            //}

                //glutPostRedisplay();
        break;
        case 'q':
            exit(0);
        break;
        /*case '+':
            tama=tama+0.01;
        break;
        case '-':
            tama=tama-0.01;
        break;*/
    }
}

void specialKeyInput(int key,int x, int y){
    if(key==GLUT_KEY_DOWN){
                valor_y=valor_y-0.05;
                valor_x=valor_x;
        if(valor_y<-1){
            valor_y=1;
        }
        glutPostRedisplay();
    }
    if(key==GLUT_KEY_UP){
                valor_y=valor_y+0.05;
                valor_x=valor_x;
        if(valor_y>1){
            valor_y=-1;
        }

        glutPostRedisplay();
    }
    if(key==GLUT_KEY_LEFT){
                valor_x=valor_x-0.05;
                valor_y=valor_y;
        if(valor_x<-1){
            valor_x=1;
        }

        glutPostRedisplay();
    }
    if(key==GLUT_KEY_RIGHT){
                valor_x=valor_x+0.05;
                valor_y=valor_y;
        if(valor_x>1){
            valor_x=-1;
        }
        glutPostRedisplay();
    }
}

int main (){
    cerr << "main() \n" ;
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(720, 680);
    glutCreateWindow("");
    glutDisplayFunc(Dibuja);
    glutKeyboardFunc(keyInput);
    glutSpecialFunc(specialKeyInput);
    glutMainLoop();

}
----------------------------------------------------------------------
El resultado final muestra inicialmente la marca en el centro. Pero moviendo adecuadamente el apuntador con las flechas del teclado y dibujando con la tecla a se puede dibujar casi cualquier cosa. La siguiente imagen muestra un ejemplo:

No hay comentarios.:

Publicar un comentario