   OpenGL Multiple Keypresses
  Original Question: Multiple keys? I cant move/turn at the same time./////Updated after the 9th Post/////My First ProgramMy own camera movement.Windows XP, Vc++ Express (OpenGL + Glut)I know (Ti-83+)Asm,Ti-Basic,GML,Partial Dark Basic,Dark GDK,(Nintendo DS) c++.//INCLUDES//#include <cstdlib>#include <ctime>#include <iostream>#include <math.h>#include <stdlib.h>#include <GL/glut.h>#include "imageloader.h"//VARIABLES//float camx=0,camy=0,camz=4;float lookx=0,looky=0,lookz=0;float dir=270;int speed=0;float pi=3.14159265;bool keys[256];//Makes the image into a texture, and returns the id of the textureGLuint loadTexture(Image* image) {GLuint textureId;glGenTextures(1, &textureId); //Make room for our textureglBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit//Map the image to the textureglTexImage2D(GL_TEXTURE_2D, //Always GL_TEXTURE_2D 0,   //0 for now GL_RGB,   //Format OpenGL uses for image image->width, image->height,  //Width and height 0,   //The border of the image GL_RGB, //GL_RGB, because pixels are stored in RGB format GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored    //as unsigned numbers image->pixels);//The actual pixel datareturn textureId; //Returns the id of the texture}GLuint tex_stonewall; //The id of the textureGLuint tex_grass; //The id of the texturevoid init (void) {glEnable (GL_DEPTH_TEST); //enable the depth testingglEnable (GL_LIGHTING); //enable the lighting//glEnable (GL_LIGHT0); //enable LIGHT0, our Diffuse LightglShadeModel (GL_SMOOTH); //set the shader to smooth shaderglEnable(GL_NORMALIZE);glEnable(GL_COLOR_MATERIAL);}void loadtextures(){Image* image = loadBMP("Stone Wall.bmp");tex_stonewall = loadTexture(image);//delete image; image = loadBMP("Grass.bmp");tex_grass = loadTexture(image);delete image;}void drawground(){glColor3f(1,1,1);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, tex_grass);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glPushMatrix();glBegin(GL_QUADS);for (int x = -252; x < 260; x += 8){for (int y = -252; y < 260; y += 8){glNormal3f(0.0, 0.0f, 1.0f);//FrontglTexCoord2f(0.0f, 0.0f);glVertex3f(x,y+8,0);glTexCoord2f(0.0f, 1.0f);glVertex3f(x,y,0);glTexCoord2f(1.0f, 1.0f);glVertex3f(x+8,y,0);glTexCoord2f(1.0f, 0.0f);glVertex3f(x+8,y+8,0);}}glEnd();glPopMatrix();glDisable(GL_TEXTURE_2D);/*glBegin(GL_LINES);    for (int x = -252; x < 260; x += 8)    { glVertex3i(x,-256,0); glVertex3i(x,256,0);    }    for (int y = -252; y < 260; y += 8)    { glVertex3i(-256, y,0); glVertex3i(256, y,0);    }*/} void cube(float x,float y,float z,float xsize,float ysize,float zsize){glColor3f(1,1,1);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, tex_stonewall);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glPushMatrix();glBegin(GL_QUADS);glNormal3f(0.0, 1.0f, 0.0f);//FrontglTexCoord2f(0.0f, 0.0f);glVertex3f(x-xsize,y+ysize,z-zsize);glTexCoord2f(0.0f, 1.0f);glVertex3f(x-xsize,y+ysize,z+zsize);glTexCoord2f(1.0f, 1.0f);glVertex3f(x+xsize,y+ysize,z+zsize);glTexCoord2f(1.0f, 0.0f);glVertex3f(x+xsize,y+ysize,z-zsize);glNormal3f(1.0, 0.0f, 0.0f);//RightglTexCoord2f(0.0f, 0.0f);glVertex3f(x+xsize,y-ysize,z-zsize);glTexCoord2f(0.0f, 1.0f);glVertex3f(x+xsize,y-ysize,z+zsize);glTexCoord2f(1.0f, 1.0f);glVertex3f(x+xsize,y+ysize,z+zsize);glTexCoord2f(1.0f, 0.0f);glVertex3f(x+xsize,y+ysize,z-zsize);glNormal3f(0.0, -1.0f, 0.0f);//BackglTexCoord2f(0.0f, 0.0f);glVertex3f(x-xsize,y-ysize,z-zsize);glTexCoord2f(0.0f, 1.0f);glVertex3f(x-xsize,y-ysize,z+zsize);glTexCoord2f(1.0f, 1.0f);glVertex3f(x+xsize,y-ysize,z+zsize);glTexCoord2f(1.0f, 0.0f);glVertex3f(x+xsize,y-ysize,z-zsize);glNormal3f(-1.0, 0.0f, 0.0f);//LeftglTexCoord2f(0.0f, 0.0f);glVertex3f(x-xsize,y+ysize,z-zsize);glTexCoord2f(0.0f, 1.0f);glVertex3f(x-xsize,y+ysize,z+zsize);glTexCoord2f(1.0f, 1.0f);glVertex3f(x-xsize,y-ysize,z+zsize);glTexCoord2f(1.0f, 0.0f);glVertex3f(x-xsize,y-ysize,z-zsize);glEnd();glTranslatef(x,y,z);glPopMatrix();glDisable(GL_TEXTURE_2D);}void camera(){lookx=camx+cos(dir*pi/180);looky=camy-sin(dir*pi/180);lookz=camz;gluLookAt(camx,camy,camz,lookx,looky,lookz,0,0,1);}void reshape (int w, int h) {glViewport (0, 0, (GLsizei)w, (GLsizei)h); //set the viewport to the current window specificationsglMatrixMode (GL_PROJECTION); //set the matrix to projectionglLoadIdentity ();gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 1000.0); //set the perspective (angle of sight, width, height, , depth)glMatrixMode (GL_MODELVIEW); //set the matrix back to model}void keyboardchecks() {//Move Upif (keys['w']){camx=(camx+cos(dir*pi/180));camy=(camy-sin(dir*pi/180));}//Move Downif (keys['s']){camx=(camx-cos(dir*pi/180));camy=(camy+sin(dir*pi/180));}//Leftif (keys['a']){dir-=5;}//Rightif (keys['d']){dir+=5;}//Escapeif (keys[27]){exit(0);}//No Up/Downif (keys['w']){if (keys['s']){speed=0;}}}void display (void) {glClearColor (0.0,0.0,0.0,1.0); //clear the screen to blackglClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the color buffer and the depth bufferglLoadIdentity();GLfloat ambientLight[] = {0.75,0.75,0.75, 1.0f};glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);keyboardchecks();camera();drawground();for (int x=0;x<32;x+=8){cube(x,0,4,4,4,4);}glutSwapBuffers(); //swap the buffers}void keyboard(unsigned char key, int x, int y){keys[(int)key] = true;}void keyboardUp(unsigned char key, int x, int y){keys[(int)key] = false;}void keyboardSpecial(int key, int x, int y){keys[key] = true;}void keyboardUpSpecial(int key, int x, int y){keys[key] = false;}int main (int argc, char **argv) {glutInit (&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);glutInitWindowSize (1024,768);glutInitWindowPosition (0,0);glutCreateWindow ("Coby Walker");init();loadtextures();glutDisplayFunc (display);glutIdleFunc (display);glutReshapeFunc (reshape);glutKeyboardFunc(keyboard);glutKeyboardUpFunc(keyboardUp);glutSpecialFunc(keyboardSpecial);glutSpecialUpFunc(keyboardUpSpecial);glutMainLoop ();return 0;}[Edited by - Sneftel on August 18, 2008 8:44:46 AM]
  Hi.You need to set up a bool array for the keys, say bool keyPressed[256]. Then in your keyboard function, just set the correct value in the array to true (true meaning it was pressed) then in a key up functions, set it to false. Then in your display/update function, you do all your checks for the key presses, so:if(keyPressed['w']){    move forward}and so on.   ;  I get what your sayingbut also don't,Could you edit my code or give me a piece of example code?Thanks for the reply.[Edited by - CobyWalkerGames on August 13, 2008 8:45:06 PM];  You need to have an array of of bools that represent the current key state (false=up, true=down)I dont know how those functions work as I repond to window events.Typically it would be like this.bool KeyDown[256];void OnKeyDown(unsigned char Key){KeyDown[Key]=true;return;}void OnKeyUp(unsigned char Key){KeyDown[Key]=0;return;}void OnInitalise(){memset(Key,0,sizeof(Key));return;}void OnEachFrame() //Do this each frame{if (KeyDown[VK_UP]) MoveForwards();if (KeyDown[VK_LEFT]) TurnLeft();if (KeyDown[VK_RIGHT]) TurnRight();//Draw stuff//Swap the buffers}This allows the player to hold down the buttons too. If you want it to be single presses only set the KeyDown eliment to 0 when responding to it in OnEachFrame   ;  You also need to point the appropriate GLUT-callbacks for keydown and keyup as well./Robert   ;  I am so sorry I tried to use this in my code and still cant get it to compile right.Can someone modify my code and help me out thanks.   ;  Here is what you need to do:bool keys[256];   //put this in at the top of the program//here are the key up and key down functionsvoid keyboard(unsigned char key, int x, int y){keys[(int)key] = true;}void keyboardUp(unsigned char key, int x, int y){keys[(int)key] = false;}void keyboardSpecial(int key, int x, int y){keys[key] = true;}void keyboardUpSpecial(int key, int x, int y){keys[key] = false;}//then when you setup GLUT, put these along with the othersglutKeyboardFunc(keyboard);glutKeyboardUpFunc(keyboardUp);glutSpecialFunc(keyboardSpecial);glutSpecialUpFunc(keyboardUpSpecial);//Then in your display function, do all your keypress checksWe are not going to edit your code for you. If you are having compile errors, please describe them and paste the errors, and we will help you.   ;  Look at my first post updated code. Still not right?   ;  There is an issue in your Keyboard checks.if (Key['x']=1) = is assignment so all your keys are being set to true.When you meant is ==However when your testing for something being non-zero (as in this case) you can just doif (key['x']) DoStuff();   ;  WOW!It works this is a lot better.I have been trying to figure this out for weeks now.I actually had thoughts of abandoning OpenGL.I will update my code for others.Thanks all that posted this was a humongous help.