Sign in to follow this  
CobyWalkerGames

OpenGL OpenGL Multiple Keypresses

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
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
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
This had NOTHING to do with OpenGL specificly, this had to do with GLUT.
OpenGL is a Graphics API, it doesn't have anything to do with input.

I am glad your problem is fixed, but I hope you realize that abandoning OpenGL over input trouble doesn't make sense.

Share this post


Link to post
Share on other sites
Stop using glut... Go to NeHe's site and find out how to make a window and make your games without glut... You'll soon find out that you'll havemore freedom and it's my personal opinion that it's a little bit faster... After you write that kind of program, go to LRESULT CALLBACK WndProc(...) and to case WM_KEYDOWN: where you can monitor every keypass... That was my solution in some game... But it's a C++ thing anyway...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Partner Spotlight

  • Forum Statistics

    • Total Topics
      627636
    • Total Posts
      2978331
  • Similar Content

    • By xhcao
      Before using void glBindImageTexture(    GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format), does need to make sure that texture is completeness. 
    • By cebugdev
      hi guys, 
      are there any books, link online or any other resources that discusses on how to build special effects such as magic, lightning, etc. in OpenGL? i mean, yeah most of them are using particles but im looking for resources specifically on how to manipulate the particles to look like an effect that can be use for games,. i did fire particle before, and I want to learn how to do the other 'magic' as well.
      Like are there one book or link(cant find in google) that atleast featured how to make different particle effects in OpenGL (or DirectX)? If there is no one stop shop for it, maybe ill just look for some tips on how to make a particle engine that is flexible enough to enable me to design different effects/magic 
      let me know if you guys have recommendations.
      Thank you in advance!
    • By dud3
      How do we rotate the camera around x axis 360 degrees, without having the strange effect as in my video below? 
      Mine behaves exactly the same way spherical coordinates would, I'm using euler angles.
      Tried googling, but couldn't find a proper answer, guessing I don't know what exactly to google for, googled 'rotate 360 around x axis', got no proper answers.
       
      References:
      Code: https://pastebin.com/Hcshj3FQ
      The video shows the difference between blender and my rotation:
       
    • By Defend
      I've had a Google around for this but haven't yet found some solid advice. There is a lot of "it depends", but I'm not sure on what.
      My question is what's a good rule of thumb to follow when it comes to creating/using VBOs & VAOs? As in, when should I use multiple or when should I not? My understanding so far is that if I need a new VBO, then I need a new VAO. So when it comes to rendering multiple objects I can either:
      * make lots of VAO/VBO pairs and flip through them to render different objects, or
      * make one big VBO and jump around its memory to render different objects. 
      I also understand that if I need to render objects with different vertex attributes, then a new VAO is necessary in this case.
      If that "it depends" really is quite variable, what's best for a beginner with OpenGL, assuming that better approaches can be learnt later with better understanding?
       
    • By test opty
      Hello all,
       
      On my Windows 7 x64 machine I wrote the code below on VS 2017 and ran it.
      #include <glad/glad.h>  #include <GLFW/glfw3.h> #include <std_lib_facilities_4.h> using namespace std; void framebuffer_size_callback(GLFWwindow* window , int width, int height) {     glViewport(0, 0, width, height); } //****************************** void processInput(GLFWwindow* window) {     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)         glfwSetWindowShouldClose(window, true); } //********************************* int main() {     glfwInit();     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);     GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);     if (window == nullptr)     {         cout << "Failed to create GLFW window" << endl;         glfwTerminate();         return -1;     }     glfwMakeContextCurrent(window);     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))     {         cout << "Failed to initialize GLAD" << endl;         return -1;     }     glViewport(0, 0, 600, 480);     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);     glClearColor(0.2f, 0.3f, 0.3f, 1.0f);     glClear(GL_COLOR_BUFFER_BIT);     while (!glfwWindowShouldClose(window))     {         processInput(window);         glfwSwapBuffers(window);         glfwPollEvents();     }     glfwTerminate();     return 0; }  
      The result should be a fixed dark green-blueish color as the end of here. But the color of my window turns from black to green-blueish repeatedly in high speed! I thought it might be a problem with my Graphics card driver but I've updated it and it's: NVIDIA GeForce GTX 750 Ti.
      What is the problem and how to solve it please?
  • Popular Now