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
davek20    127
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
empirical2    567
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
davek20    127
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
empirical2    567
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
DantarionX    166
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
CTPAX    122
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  

  • Similar Content

    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
    • By markshaw001
      Hi i am new to this forum  i wanted to ask for help from all of you i want to generate real time terrain using a 32 bit heightmap i am good at c++ and have started learning Opengl as i am very interested in making landscapes in opengl i have looked around the internet for help about this topic but i am not getting the hang of the concepts and what they are doing can some here suggests me some good resources for making terrain engine please for example like tutorials,books etc so that i can understand the whole concept of terrain generation.
       
    • By KarimIO
      Hey guys. I'm trying to get my application to work on my Nvidia GTX 970 desktop. It currently works on my Intel HD 3000 laptop, but on the desktop, every bind textures specifically from framebuffers, I get half a second of lag. This is done 4 times as I have three RGBA textures and one depth 32F buffer. I tried to use debugging software for the first time - RenderDoc only shows SwapBuffers() and no OGL calls, while Nvidia Nsight crashes upon execution, so neither are helpful. Without binding it runs regularly. This does not happen with non-framebuffer binds.
      GLFramebuffer::GLFramebuffer(FramebufferCreateInfo createInfo) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); textures = new GLuint[createInfo.numColorTargets]; glGenTextures(createInfo.numColorTargets, textures); GLenum *DrawBuffers = new GLenum[createInfo.numColorTargets]; for (uint32_t i = 0; i < createInfo.numColorTargets; i++) { glBindTexture(GL_TEXTURE_2D, textures[i]); GLint internalFormat; GLenum format; TranslateFormats(createInfo.colorFormats[i], format, internalFormat); // returns GL_RGBA and GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, createInfo.width, createInfo.height, 0, format, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); } if (createInfo.depthFormat != FORMAT_DEPTH_NONE) { GLenum depthFormat; switch (createInfo.depthFormat) { case FORMAT_DEPTH_16: depthFormat = GL_DEPTH_COMPONENT16; break; case FORMAT_DEPTH_24: depthFormat = GL_DEPTH_COMPONENT24; break; case FORMAT_DEPTH_32: depthFormat = GL_DEPTH_COMPONENT32; break; case FORMAT_DEPTH_24_STENCIL_8: depthFormat = GL_DEPTH24_STENCIL8; break; case FORMAT_DEPTH_32_STENCIL_8: depthFormat = GL_DEPTH32F_STENCIL8; break; } glGenTextures(1, &depthrenderbuffer); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, createInfo.width, createInfo.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthrenderbuffer, 0); } if (createInfo.numColorTargets > 0) glDrawBuffers(createInfo.numColorTargets, DrawBuffers); else glDrawBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer Incomplete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); width = createInfo.width; height = createInfo.height; } // ... // FBO Creation FramebufferCreateInfo gbufferCI; gbufferCI.colorFormats = gbufferCFs.data(); gbufferCI.depthFormat = FORMAT_DEPTH_32; gbufferCI.numColorTargets = gbufferCFs.size(); gbufferCI.width = engine.settings.resolutionX; gbufferCI.height = engine.settings.resolutionY; gbufferCI.renderPass = nullptr; gbuffer = graphicsWrapper->CreateFramebuffer(gbufferCI); // Bind glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw here... // Bind to textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, textures[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); Here is an extract of my code. I can't think of anything else to include. I've really been butting my head into a wall trying to think of a reason but I can think of none and all my research yields nothing. Thanks in advance!
    • By Adrianensis
      Hi everyone, I've shared my 2D Game Engine source code. It's the result of 4 years working on it (and I still continue improving features ) and I want to share with the community. You can see some videos on youtube and some demo gifs on my twitter account.
      This Engine has been developed as End-of-Degree Project and it is coded in Javascript, WebGL and GLSL. The engine is written from scratch.
      This is not a professional engine but it's for learning purposes, so anyone can review the code an learn basis about graphics, physics or game engine architecture. Source code on this GitHub repository.
      I'm available for a good conversation about Game Engine / Graphics Programming
  • Popular Now