# Basic 2D car game problem

Show 40 post(s) from this thread on one page
Page 2 of 2 First 12
• 08-17-2013, 04:31 AM
Marc Colomé
Quote:

Originally Posted by Carmine
Yes. That's what you said. But your code doesn't show that you know how to do even basic rotations and translations. To me the code is the truth. It is where you are at. If you can do basic rotations and translations, show it to us in the code. Explain why you are not satisfied with them. I think you'll get more responses from there. You will from me.

Thank you Carmine! Here you have the code:

#include <iostream>
#include <stdlib.h>
#include <glut.h>

using namespace std;

float _angle = 0.0f;//For rotating the car
float xpos = 0.0f;//For moving the car in the X axis
float ypos = 0.0f;//For moving the car in the Y axis
float cameraheight = -20.0f;//For zoom or unzoom the camera

//Called when a key is pressed
void handleKeypress(unsigned char key, int x, int y) {
switch (key) {
case 27: //ESC
exit(0);
break;

case 49: //Number 1
_angle += 5.0f;
break;

case 50: //Number 2
_angle -= 5.0f;
break;

case 51: //Number 3
cameraheight -= 5.0f;
break;

case 52: //Number 4
cameraheight += 5.0f;
break;

case 53: //Number 5
xpos += 1.0f;
break;

case 54: //Number 6
xpos -= 1.0f;
break;

case 55: //Number 7
ypos += 1.0f;
break;

case 56: //Number 8
ypos -= 1.0f;
break;

/*case 57: //Number 9

break;

case 58: //Number 0

break;*/

}
}

//Initializes 3D rendering
void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL); //Enable color
glClearColor(0.7f, 0.9f, 1.0f, 1.0f); //Background color is sky blue
}

//Called when the window is resized
void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
gluPerspective(45.0, (double)w / (double)h, 0.01/*Min render distance*/, 1000.0/*Max distance*/);//Meters
}

//Draws the 3D scene
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0f, 0.0f, cameraheight);//I have moved the circuit and the car 20 meters under, so now
//the camera is "set" at 20 meters high than the car and the circuit

//CAR
glPushMatrix(); //Save the transformations performed thus far
glTranslatef(xpos, ypos, 0.0f);
glRotatef(_angle, 0.0f, 0.0f, 1.0f); //Rotate about the z-axis

glColor3f(1.0f, 0.0f, 0.0f); //Red Ferrari
glVertex3f(-2.25f, 1.0f, 0.0f); //Meters (4,5m long per 2,25m wide)
glVertex3f(2.25f, 1.0f, 0.0f);
glVertex3f(2.25f, -1.0f, 0.0f);
glVertex3f(-2.25f, -1.0f, 0.0f);
glEnd();

glPopMatrix(); //Undo the move of the car

//CIRCUIT
glPushMatrix();
glScalef(0.25f, 0.25f, 0.25f);//25% original size

glColor3f(0.2f, 0.2f, 0.2f); //Asphalt color
glVertex3f(-200.0f, 200.0f, 0.0f); //Meters
glVertex3f(200.0f, 200.0f, 0.0f);
glVertex3f(200.0f, -200.0f, 0.0f);
glVertex3f(-200.0f, -200.0f, 0.0f);
glEnd();
glPopMatrix();

glutSwapBuffers();
}

void update(int value) {
if (_angle > 360) {
_angle -= 360;
}

glutPostRedisplay();
glutTimerFunc(16, update, 0);
}

int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(320, 240);

//Create the window
glutCreateWindow("Test");
initRendering();

//Set handler functions
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutTimerFunc(16, update, 0); //Add a timer

glutMainLoop();
return 0;
}

I'm not satisfied because when I rotate the car it not goes in the direction is facing, it only goes up/down/left/right. I don't know how to make it go correctly

So much thank you,

Marc
• 08-17-2013, 12:28 PM
Carmine
Quote:

I'm not satisfied because when I rotate the car it not goes in the direction is facing, it only goes up/down/left/right. I don't know how to make it go correctly
Good on you for posting your code. It compiles and runs for me. Now we can move forward. I THINK I understand what you want by the statement above. If so, you only have to make a minor change to get closer to your goal. In the line where you rotate the car in 'drawScene', try changing the Y rotation to a Z rotation (Z is perpendicular to the screen). This is done in my version of the code below. I did some minor reformatting so that it would fit my eye better. The animation is turned off to make debugging easier. The code that draws the car is put into a routine called 'Draw_Car'. Finally, I got rid of the big rectangle you call 'asphalt' and put that color in glClearColor. Note that if you use [ code] and [ /code] (without the spaces) with proper indenting. it will make your code much easier to read.
Code :

```//---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\   #include <stdio.h> #include <stdlib.h> #include <gl.h> #include <glu.h> #include <glut.h>   float _angle = 0.0f, // For rotating the car xpos = 0.0f, // For moving the car in the X axis ypos = 0.0f; // For moving the car in the Y axis   float cameraheight = -20.0f; // For zoom or unzoom the camera   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //-------------------------------------- handleKeypress -----------------------------------------   void handleKeypress (unsigned char key, int x, int y) { switch (key) { case '1': _angle += 5.0f; break; case '2': _angle -= 5.0f; break; case '3': cameraheight -= 5.0f; break; case '4': cameraheight += 5.0f; break; case '5': xpos += 1.0f; break; case '6': xpos -= 1.0f; break; case '7': ypos += 1.0f; break; case '8': ypos -= 1.0f; break;   case 'r': xpos = 0.0f; ypos = 0.0f; _angle = 0.0f; cameraheight = -20.0f; break;   case 27: exit(0); break; // esc }   glutPostRedisplay (); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //--------------------------------------- initRendering ----------------------------------------   void initRendering (void) { glEnable (GL_DEPTH_TEST); glEnable (GL_COLOR_MATERIAL); glClearColor (0.2f, 0.2f, 0.2f, 1.0f); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //--------------------------------------- handleResize -----------------------------------------   void handleResize (int w, int h) { glViewport (0, 0, w, h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (45.0, (double)w / (double)h, 0.01, 500.0); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //----------------------------------------- Draw_Car -------------------------------------------   void Draw_Car (void) { glBegin (GL_QUADS); // Ferrari glColor3f ( 1.0f , 0.0f, 0.0f); // Red Ferrari glVertex3f (-2.25f, 1.0f, 0.0f); // Meters (4,5m long per 2,25m wide) glVertex3f ( 2.25f, 1.0f, 0.0f); glVertex3f ( 2.25f, -1.0f, 0.0f); glVertex3f (-2.25f, -1.0f, 0.0f); glEnd(); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //---------------------------------------- drawScene -------------------------------------------   void drawScene (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glMatrixMode (GL_MODELVIEW); glLoadIdentity ();   // glRotatef (-_angle, 0.0f, 1.0f, 0.0f); glRotatef (-_angle, 0.0f, 0.0f, 1.0f); glTranslatef ( 0.0f, 0.0f, cameraheight);   glPushMatrix(); glTranslatef (xpos, ypos, 0.0f); Draw_Car (); glPopMatrix();   glutSwapBuffers(); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //------------------------------------------ update --------------------------------------------   void update (int value) { _angle += 0.1f;   if (_angle > 360 ) _angle -= 360;   glutPostRedisplay (); glutTimerFunc (16, update, 0); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //------------------------------------------- main ---------------------------------------------   int main (int argc, char* argv[]) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (640, 480); glutInitWindowPosition (400, 200);   glutCreateWindow ("Test"); initRendering ();   glutDisplayFunc (drawScene); glutKeyboardFunc (handleKeypress); glutReshapeFunc (handleResize); // glutTimerFunc (16, update, 0);   glutMainLoop (); return 0; }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\```
• 08-18-2013, 05:17 AM
Marc Colomé
Quote:

Originally Posted by Carmine
Good on you for posting your code. It compiles and runs for me. Now we can move forward. I THINK I understand what you want by the statement above. If so, you only have to make a minor change to get closer to your goal. In the line where you rotate the car in 'drawScene', try changing the Y rotation to a Z rotation (Z is perpendicular to the screen). This is done in my version of the code below. I did some minor reformatting so that it would fit my eye better. The animation is turned off to make debugging easier. The code that draws the car is put into a routine called 'Draw_Car'. Finally, I got rid of the big rectangle you call 'asphalt' and put that color in glClearColor. Note that if you use [ code] and [ /code] (without the spaces) with proper indenting. it will make your code much easier to read.
Code :

```//---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\   #include <stdio.h> #include <stdlib.h> #include <gl.h> #include <glu.h> #include <glut.h>   float _angle = 0.0f, // For rotating the car xpos = 0.0f, // For moving the car in the X axis ypos = 0.0f; // For moving the car in the Y axis   float cameraheight = -20.0f; // For zoom or unzoom the camera   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //-------------------------------------- handleKeypress -----------------------------------------   void handleKeypress (unsigned char key, int x, int y) { switch (key) { case '1': _angle += 5.0f; break; case '2': _angle -= 5.0f; break; case '3': cameraheight -= 5.0f; break; case '4': cameraheight += 5.0f; break; case '5': xpos += 1.0f; break; case '6': xpos -= 1.0f; break; case '7': ypos += 1.0f; break; case '8': ypos -= 1.0f; break;   case 'r': xpos = 0.0f; ypos = 0.0f; _angle = 0.0f; cameraheight = -20.0f; break;   case 27: exit(0); break; // esc }   glutPostRedisplay (); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //--------------------------------------- initRendering ----------------------------------------   void initRendering (void) { glEnable (GL_DEPTH_TEST); glEnable (GL_COLOR_MATERIAL); glClearColor (0.2f, 0.2f, 0.2f, 1.0f); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //--------------------------------------- handleResize -----------------------------------------   void handleResize (int w, int h) { glViewport (0, 0, w, h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (45.0, (double)w / (double)h, 0.01, 500.0); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //----------------------------------------- Draw_Car -------------------------------------------   void Draw_Car (void) { glBegin (GL_QUADS); // Ferrari glColor3f ( 1.0f , 0.0f, 0.0f); // Red Ferrari glVertex3f (-2.25f, 1.0f, 0.0f); // Meters (4,5m long per 2,25m wide) glVertex3f ( 2.25f, 1.0f, 0.0f); glVertex3f ( 2.25f, -1.0f, 0.0f); glVertex3f (-2.25f, -1.0f, 0.0f); glEnd(); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //---------------------------------------- drawScene -------------------------------------------   void drawScene (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glMatrixMode (GL_MODELVIEW); glLoadIdentity ();   // glRotatef (-_angle, 0.0f, 1.0f, 0.0f); glRotatef (-_angle, 0.0f, 0.0f, 1.0f); glTranslatef ( 0.0f, 0.0f, cameraheight);   glPushMatrix(); glTranslatef (xpos, ypos, 0.0f); Draw_Car (); glPopMatrix();   glutSwapBuffers(); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //------------------------------------------ update --------------------------------------------   void update (int value) { _angle += 0.1f;   if (_angle > 360 ) _angle -= 360;   glutPostRedisplay (); glutTimerFunc (16, update, 0); }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\ //------------------------------------------- main ---------------------------------------------   int main (int argc, char* argv[]) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (640, 480); glutInitWindowPosition (400, 200);   glutCreateWindow ("Test"); initRendering ();   glutDisplayFunc (drawScene); glutKeyboardFunc (handleKeypress); glutReshapeFunc (handleResize); // glutTimerFunc (16, update, 0);   glutMainLoop (); return 0; }   //---+----4----+----3----+----2----+----1----+---||---+----1----+----2----+----3----+----4----+---\\```

Now almost perfect my friend! But the rotating center is at x=0 and y=0 everytime, it should be updated when I translate the car, because if I now rotate the car and then I translate it, it not rotates in its center of gravity, it does it around 0,0

Many thanks,

Marc
• 08-19-2013, 12:35 PM
Carmine
Quote:

... I now rotate the car and then I translate it, it not rotates in its center of gravity, it does it around 0,0
Next - change the drawScene routine to the one I have below. The only change from the original routine is that the glRotate is moved. You'll get the same result. Now try switching the order of glRotate and glTranslate. What happens? It's important to experience this.

Code :

```void drawScene (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glMatrixMode (GL_MODELVIEW); glLoadIdentity ();   glTranslatef ( 0.0f, 0.0f, cameraheight);   // Rotation moved into Push-Pop block to make it only apply to car. // Try code below. Then try putting glRotate after glTranslate. // Neither way works. Something more sophisticated has to be done.   glPushMatrix(); glRotatef (-_angle, 0.0f, 0.0f, 1.0f); glTranslatef (xpos, ypos, 0.0f); Draw_Car (); glPopMatrix();   glutSwapBuffers(); }```
Show 40 post(s) from this thread on one page
Page 2 of 2 First 12