Hi I followed the tutorial on Swiftless. The last post I worked through was about Keyboard input and it does work. Basically what he covers is how to detect whether a key was pressed or realeased.
So I tried to experiment around. To do so I wanted to make the application to terminate when 'e' is pressed.
#include "glew.h"// Include the GLUT header file
#include "glut.h" // Include the GLEW header file
bool* keyStates = new bool[256](); // Create an array of boolean values of length 256 (0-255)
bool* keySpecialStates = new bool[256](); // Create an array of boolean values of length 256 (0-255)
bool* keyPreviousStates = new bool[256]();
void renderPrimitive(void)
{
glBegin(GL_QUADS); // Start drawing a quad primitive
glVertex3f(-1.0f,-1.0f,0.0f); //Bottom Left
glVertex3f(-1.0f,1.0f,0.0f); //Top Left
glVertex3f(1.0f,1.0f,0.0f); //Top Right
glVertex3f(1.0f,-1.0f,0.0f); //Bottom Right
glEnd();
}
void keyOperations(void)
{
if ((!keyStates['e']) && keyPreviousStates['e']) // If the 'a' key has been pressed
{
// Perform 'e' key operations
exit(0);
}
}
void keySpecialOperations(void)
{
if (keySpecialStates[GLUT_KEY_LEFT]) // If the left arrow key has been pressed
{
// Perform left arrow key operations
}
}
void display(void) {
keyOperations();
keySpecialOperations();
glClearColor(0.706f, 0.706f, 0.706f, 2.0f); // Clear the background of our window to red
glClear(GL_COLOR_BUFFER_BIT); //Clear the colour buffer (more buffers later on)
glLoadIdentity(); // Load the Identity Matrix to reset our drawing locations
glTranslatef(0.0f,0.0f,-5.0f); // Push eveything 5 units back into the scene, otherwise we won't see the primitive
renderPrimitive(); //render the primitive
glFlush(); // Flush the OpenGL buffers to the window
keyPreviousStates = keyStates;
}
void reshape(int width, int height)
{
glViewport(0, 0, (GLsizei)width, (GLsizei)height); // Set our viewport to the size of our window. (0,0) being bottom left in the window.
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
gluPerspective(60,(GLfloat)width/(GLfloat)height,1.0,100.0); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
glMatrixMode(GL_MODELVIEW);
}
void keyPressed(unsigned char key,int x, int y)
{
keyStates[key] = true; //Set the state of the current key to pressed
}
void keyUp(unsigned char key,int x, int y)
{
keyStates[key] = false; //Set the state of the current key to not pressed
}
void keySpecial(int key, int x,int y)
{
keySpecialStates[key] = true;
}
void keySpecialUp(int key,int x,int y)
{
keySpecialStates[key] = false;
}
int main(int argc, char **argv) {
glutInit(&argc, argv); // Initialize GLUT
glutInitDisplayMode(GLUT_SINGLE); // Set up a basic display buffer (only single buffered for now)
glutInitWindowSize(500, 500); // Set the width and height of the window
glutInitWindowPosition(100, 100); // Set the position of the window
glutCreateWindow("Your first OpenGL Window"); // Set the title for the window
glutDisplayFunc(display); // Tell GLUT to use the method "display" for rendering
glutReshapeFunc(reshape); // Tell GLUT to use the method "reshape" for reshaping
glutKeyboardFunc(keyPressed); // Tell GLUT to use the method "keyPressed" for key presses
glutKeyboardUpFunc(keyUp); // Tell GLUT to use the method "keyUp" for key up events
glutSpecialFunc(keySpecial); // Tell GLUT to use the method "keySpecial" for special key presses
glutSpecialUpFunc(keySpecialUp); // Tell GLUT to use the method "keySpecialUp" for special up key events
glutMainLoop(); // Enter GLUT's main loop
}
So I changed the keyOperations() code a little. I tried to add another bool-array which stores the state of the keys from the previous display()-iteration. Then I try to check if 'e' is currently released and if its previous state was pressed. But nothing happens
I guess this a very basic thing but I am very new to OpenGL and C++ so I could only think of the way I would implement this in XNA. Btw I am assigning the previous key states at the end of the display function.
Thanks in advance.