Jump to content
  • Advertisement
Sign in to follow this  
CobyWalkerGames

OpenGL OpenGL Multiple Keypresses

This topic is 3625 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Original Question: Multiple keys? I cant move/turn at the same time. /////Updated after the 9th Post///// My First Program My 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 texture GLuint loadTexture(Image* image) { GLuint textureId; glGenTextures(1, &textureId); //Make room for our texture glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit //Map the image to the texture glTexImage2D(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 data return textureId; //Returns the id of the texture } GLuint tex_stonewall; //The id of the texture GLuint tex_grass; //The id of the texture void init (void) { glEnable (GL_DEPTH_TEST); //enable the depth testing glEnable (GL_LIGHTING); //enable the lighting //glEnable (GL_LIGHT0); //enable LIGHT0, our Diffuse Light glShadeModel (GL_SMOOTH); //set the shader to smooth shader glEnable(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);//Front glTexCoord2f(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);//Front glTexCoord2f(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);//Right glTexCoord2f(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);//Back glTexCoord2f(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);//Left glTexCoord2f(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 specifications glMatrixMode (GL_PROJECTION); //set the matrix to projection glLoadIdentity (); 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 Up if (keys['w']){ camx=(camx+cos(dir*pi/180)); camy=(camy-sin(dir*pi/180));} //Move Down if (keys['s']){ camx=(camx-cos(dir*pi/180)); camy=(camy+sin(dir*pi/180));} //Left if (keys['a']){dir-=5;} //Right if (keys['d']){dir+=5;} //Escape if (keys[27]){exit(0);} //No Up/Down if (keys['w']){if (keys['s']){speed=0;}} } void display (void) { glClearColor (0.0,0.0,0.0,1.0); //clear the screen to black glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the color buffer and the depth buffer glLoadIdentity(); 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]

Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
I get what your saying
but 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]

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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 functions
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;
}

//then when you setup GLUT, put these along with the others
glutKeyboardFunc(keyboard);
glutKeyboardUpFunc(keyboardUp);
glutSpecialFunc(keyboardSpecial);
glutSpecialUpFunc(keyboardUpSpecial);

//Then in your display function, do all your keypress checks



We 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.

Share this post


Link to post
Share on other sites
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 do

if (key['x']) DoStuff();

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!