i want to use keyboard key to move the object on the path but after using keyboard function the object is not moving.Please help me with this.after applying keyboard function the object is not moving from its place.
i want to add 3 different function for wave/path so keyboard interaction is necessary for me, so that i may able to use different keys for different scenes.
void object()
{
glPushMatrix();
glTranslatef(x, y, 0);
glBegin(GL_LINES);
glColor3f(0, 0, 0);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glEnd();
glPopMatrix();
glFlush();
}
void drawsine()
{ glBegin(GL_LINE_STRIP);//Primitive
glColor3f(255, 0, 0);//Set drawing color
int i = 0;
float x = 0, y = 0;
for (x = -5; x < 6; x = x + 0.1)
{ y = (sin(3.142*x)) / 3.142*x;
glVertex2f(x, y);
sinex[i] = x;
siney[i] = y;
i++;}
glEnd();
glFlush();
}
void doFrame(int v) {
//x = sinex[i];
//y = siney[i];
if (x < 5.9)
{
x += 0.1;
y = (sin(3.142*x)) / 3.142*x;
}
glutPostRedisplay();
//glutTimerFunc(x,doFrame,0);
}
void scene1()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
drawsine();
glPopMatrix();
//glScaled(0.3, 0.3, 1);
object();
//glutTimerFunc(30,doFrame,0);
glutSwapBuffers();
}
void exit(void)
{
exit(-1);
}
void myKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'h':
{
scene1(); }
break;
case 'e':
{
exit(); }
break;
}
}
void display() {
//glClear(GL_COLOR_BUFFER_BIT);
}
void init() {
glClearColor(1, 1, 1, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5, 7, -5, 5, -1, 1);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(700, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Roller Coaster Simulation");
init();
glutDisplayFunc(display);
glutTimerFunc(200, doFrame, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
return 0;
}
You've to draw the scene in the display callback glutDisplayFunc
.
Add a scene state (current_scene
) and switch the state when a key is pressed:
e.g.
int current_scene = 1;
void myKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'h': current_scene = 1; break;
case 'i': current_scene = 2; break;
// [...]
}
}
Draw a scene dependent on the state in the display callback:
void display() {
glClear(GL_COLOR_BUFFER_BIT);
switch(current_scene) {
case 1: scene1(); break;
case 2: scene2(); break;
// [...]
}
glutSwapBuffers();
glutPostRedisplay();
}
I recommend to do the buffer swap (glutSwapBuffers
) in disaply
only. Remove it form the other functions.
Use glutPostRedisplay
to mark the current window as needing to be redisplayed continuously.