PDA

View Full Version : Regarding GLUT's KeboardFunc's

Newbie1234
09-11-2011, 03:46 AM
/* --------------------------------------------------------------------------
A program to draw tetris blocks using Bresenhams Algorithm
------------------------------------------------------------------------- */
#include<GL/freeglut.h>
#include <stdlib.h>
#include <stdio.h>
#include<math.h>
void init(void)
{
//set display-window background color to white
glClearColor(1.0,1.0,1.0,0.0);
//set projection paramaters
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void setPixel(GLint xCoordinate, GLint yCoordinate)
{
glBegin(GL_POINTS);
glVertex2i(xCoordinate,yCoordinate);
glEnd();
glFlush(); //executes all OpenGL functions as quickly as possible
}
//Bresenham line-drawing procedure for |m| < 1.0
void lineBres(GLint x0, GLint y0, GLint xEnd, GLint yEnd)
{
GLint dx = fabs(xEnd - x0);
GLint dy = fabs(yEnd - y0);
GLint p = 2 * dy - dx;
GLint twoDy = 2 * dy;
GLint twoDyMinusDx = 2 * (dy-dx);
GLint x,y;
// determine which endpoint to use as start position
if (x0 > xEnd)
{
x = xEnd;
y = yEnd;
xEnd = x;
}
else
{
x = x0;
y = y0;
}

setPixel(x,y);
while(x<xEnd)
{
x++;
if(p<0)
p += twoDy;
else
{
y++;
p += twoDyMinusDx;
}
setPixel(x,y);
}
}

void drawbox(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//Red color.

int i=0,j=150,k =0;
GLint x0,y0,xEnd,yEnd;

for(j =150;j<200;j++)
for(i =100;i<150;i++)
{
glPointSize(10.0); // the width of the point.
GLint x0 =i; // initial point - x
GLint y0 = j; // '' '' - y
GLint xEnd = i;
GLint yEnd = j;
lineBres(x0,y0,xEnd,yEnd);
}

}

void drawZ(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//Red color.
glPointSize(40.0); // the width of the point.

int i=0,j=150,k =0;
GLint x0,y0,xEnd,yEnd;
x0 = 100;
y0 = 150;
xEnd = 110;
yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);

x0 = 121;
y0 = 171;
xEnd = 130;
yEnd = 171;
lineBres(x0,y0,xEnd,yEnd);

}

void drawiZ(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//Red color.
glPointSize(40.0); // the width of the point.

int i=0,j=150,k =0;
GLint x0,y0,xEnd,yEnd;
x0 = 100;
y0 = 150;
xEnd = 110;
yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);

x0 = 81;
y0 = 171;
xEnd = 90;
yEnd = 171;
lineBres(x0,y0,xEnd,yEnd);
}

void drawMyLine(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(10.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 150;
GLint yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);
}

void drawT(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(40.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 150;
GLint yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);

x0 = 125;
y0 = 120;
xEnd = 125;
yEnd = 120;
lineBres(x0,y0,xEnd,yEnd);
}

void drawJ(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(40.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 150;
GLint yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);

x0 = 100;
y0 = 120;
xEnd = 100;
yEnd = 120;
lineBres(x0,y0,xEnd,yEnd);
}

void drawL(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(40.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 150;
GLint yEnd = 150;
lineBres(x0,y0,xEnd,yEnd);

x0 = 150;
y0 = 120;
xEnd = 150;
yEnd = 120;
lineBres(x0,y0,xEnd,yEnd);
}
void reshape (int width, int height) {
glViewport(0, 0, (GLsizei)width, (GLsizei)height); // Set our viewport to the size of our window
glMatrixMode(GL_PROJECTION); // Switch to the projection matrix so that we can manipulate how our scene is viewed
glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
glMatrixMode(GL_MODELVIEW); // Switch back to the model view matrix, so that we can start drawing shapes correctly
}
void keyPressed(unsigned char key, int x, int y)
{

glutDisplayFunc(drawbox);
int i =0;
while(key != 27)
{
if(key == 116)
{

if(i++ == 0&amp;&amp; key == 116)
glutDisplayFunc(drawbox);
else if(i++ == 1&amp;&amp; key == 116)
glutDisplayFunc(drawZ);
else if(i++ == 2)
glutDisplayFunc(drawiZ);
else if(i++ == 3)
glutDisplayFunc(drawJ);
else if(i++ == 4)
glutDisplayFunc(drawL);
else if(i++ == 5)
glutDisplayFunc(drawT);
else if(i++ == 6)
glutDisplayFunc(drawMyLine);
else{
glutDisplayFunc(drawMyLine);
break;
}
i++;
}
else
printf("%c",key);
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}

void main(int argc, char**argv)
{
//initialize GLUT
glutInit(&amp;argc,argv);
//initialize display mode
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//set display-window width & height
glutInitWindowSize(400,400);
//set display-window upper-left position
glutInitWindowPosition(0,0);
//create display-window with a title
glutCreateWindow("DDA by V");

//initialze OpenGL
init();
//keyboard func.
glutKeyboardFunc(keyPressed);

// glutDisplayFunc(drawiZ);
//glutReshapeFunc(reshape);
glutDisplayFunc(drawJ);

// glutKeyboardFunc(keyPressed);
//call graphics to be displayed on the window
//display everything and wait
glutMainLoop();
}

Hi,
I am new to OpenGL and GLUT programming.
So i started making sometetris blocks. and wanted to change the shape between the 7 blocks. But whenever i try to run the program. It goes into an infinite loop. I would be deeply obliged if someone could guide me through this.

P.S.: the remaining code just has the displayfunctions for the different shapes.(and they work perfectly fine without the keybooardFunc.)

Thanking you again and if the code is a bit unindented please excuse me. (It is amazing late at my place.)
a Newbie.

carsten neumann
09-11-2011, 03:35 PM
GLUT implements a simple event system, you register functions for events you are interested in (e.g. window needs to be redrawn, a key was pressed) and update your application state in these handlers.

Your keyPressed() handler has a loop:

while(key != 27)
{
if(key == 116)
{

if(i++ == 0&amp;&amp; key == 116)
glutDisplayFunc(drawbox);
else if(i++ == 1&amp;&amp; key == 116)
glutDisplayFunc(drawZ);
else if(i++ == 2)
glutDisplayFunc(drawiZ);
else if(i++ == 3)
glutDisplayFunc(drawJ);
else if(i++ == 4)
glutDisplayFunc(drawL);
else if(i++ == 5)
glutDisplayFunc(drawT);
else if(i++ == 6)
glutDisplayFunc(drawMyLine);
else{
glutDisplayFunc(drawMyLine);
break;
}
i++;
}
else
printf("%c",key);
}
}

So if you press a key GLUT calls your handler function and if the key was not ESC the handler goes into an infinite loop.
If you want something to happen while a key is pressed your handler function should record the fact that a key is pressed (or released respectively) and in the display (or idle) functions you check which keys are pressed and make your update accordingly.
If these updates move objects around the amount they move should really depend on the time since the previous frame, otherwise object movement speed is frame rate dependent, but you can leave that as a second step.