es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mover múltiples formas 2D en OpenGL con la pulsación de teclas.

Actualmente quiero hacer que estas formas se puedan mover individualmente cuando presione una tecla determinada, pero no estoy seguro de cómo implementarlo correctamente; he revisado esta pregunta https://stackoverflow.com/questions/20483286/how-do-i-make-a-simple-2d-shape-move-using-the-keyboard-with-glut pero aún no estoy seguro de cómo asignar una tecla para mover cada forma hacia la izquierda, derecha, arriba y abajo.

//
// INCLUYA DECLARACIONES PARA MS WINDOWS:
#include <windows.h> // para MS Windows
#include <GL/glut.h> // GLUT, incluye glu.h y gl.h
/* Inicialice la Gráfica OpenGL /
void initGL() {
// Establecer el color de “borrado” o fondo
glClearColor ( 0.0f , 0.0f , 0.0f , 1.0f ); // Negro y opaco
}
/
Manejador para el evento de repintado de ventana. Llame de vuelta cuando
la ventana aparezca por primera vez y siempre que necesite ser repintada. */
void display() {
glClear ( GL_COLOR_BUFFER_BIT ); // Limpiar el buffer de color con el color de limpieza actual

// Definir las formas encerradas dentro de un par de glBegin y glEnd
 glBegin ( GL_QUADS );              // Cada conjunto de 4 vértices forma un cuadrilátero
 glColor3f (1.0f , 0.0f , 0.0f );  // Rojo
 glVertex2f (- 0.6f ,  0.2f );     // Definir los vértices en el orden antihorario (CCW)
 glVertex2f (- 0.2f ,  0.2f );     //   para que la normal (superficie frontal) te mire
glVertex2f (- 0.2f ,  0.4f );
glVertex2f (- 0.6f ,  0.4f );
 glEnd();

 glBegin ( GL_TRIANGLES );          // Cada conjunto de 3 vértices forma un triángulo
 glColor3f (0.0f , 0.0f , 1.0f );  // Azul
glVertex2f ( - 0.4f , 0.5f );
glVertex2f ( 0.0f , 0.5f );
glVertex2f ( - 0.2f , 0.8f );
 glEnd();

 glBegin( GL_POLYGON );            // Estos vértices forman un polígono cerrado
 glColor3f (1.0f , 1.0f , 0.0f );  // Amarillo
glVertex2f ( 0.2f ,  0.0f );
glVertex2f ( 0.4f ,  0.0f );
glVertex2f ( 0.5f ,  0.2f );
glVertex2f ( 0.4f ,  0.4f );
glVertex2f ( 0.2f ,  0.4f );
glVertex2f ( 0.1f ,  0.2f );
 glEnd();

     glBegin( GL_POLYGON );            // Estos vértices forman un polígono cerrado
 glColor3f (0.0f , 1.0f , 0.0f );  // Verde
glVertex2f ( 0.6f ,  0.3f );
glVertex2f ( 0.8f ,  0.3f );
glVertex2f ( 0.9f ,  0.5f );
glVertex2f ( 0.7f ,  0.7f );
glVertex2f ( 0.5f ,  0.5f );
 glEnd();

}
int main( int argc, char** argv) {
glutInit(&argc, argv); // Inicializar GLUT
glutCreateWindow ( "Vértice, Primitiva & Color" ); // Crear ventana con el título dado
glutInitWindowSize ( 320 , 320 ); // Establecer el ancho y alto iniciales de la ventana
glutInitWindowPosition ( 50 , 50 ); // Posicionar la esquina superior izquierda inicial de la ventana
glutDisplayFunc ( display ); // Registrar el manejador de la devolución de llamada para el evento de repintado de ventana
initGL ();
glutMainLoop ();
return 0 ;
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mover individualmente cada forma cuando se presiona una tecla determinada, es necesario implementar el manejo de entrada de teclado en su programa. Puede utilizar la función glutKeyboardFunc() para registrar una función de devolución de llamada que se llamará cada vez que se presione una tecla estándar. En esta función, puede comprobar qué tecla se ha presionado y actualizar las coordenadas de la forma correspondiente para moverla en la dirección deseada.

    Por ejemplo, si desea mover la forma de cuadrado rojo a la izquierda cuando se presiona la tecla ‘a’, puede agregar el siguiente código:

    “`c ++
    void teclado(unsigned char key, int x, int y) {
    switch (key) {
    case ‘a’: // mover cuadrado rojo a la izquierda
    xCoordRedQuad -= 0.1f; // actualizar coordenada x
    glutPostRedisplay (); // actualizar pantalla
    break;
    // agregar casos para otras teclas y formas aquí
    }
    }

    int main(int argc, char** argv) {
    // …
    glutDisplayFunc (visualización);
    glutKeyboardFunc (teclado); // registrar devolución de llamada de teclado
    // …
    }
    “`

    Nota que necesitará tener un seguimiento de las coordenadas de cada forma en las variables (como xCoordRedQuad) que son accesibles desde la función de devolución de llamada de teclado. También debe llamar a glutPostRedisplay() para volver a dibujar la escena después de actualizar las coordenadas.

    Este es solo un ejemplo para comenzar, deberá ajustar el código para que se ajuste a sus requisitos específicos y agregar casos para las otras teclas y formas.

Comments are closed.