Yesterday I was looking at the demo I published in my last article, the
asteroid demo, it had a good acceptance because it was made in a very simple way
and today I will do the same. This article is a simple straightforward car race
game with minimum lines of code (LOC). There are 3 cars that begin in a
start line, they randomly change their speeds on the race and the race ends on an end line, quite simple. The user can follow the race with the keys W (forward),
S (backward) and can change the camera takes. At the end of the race, a message is shown telling which car was the winner and you are able to reset the race
and start over again. The car race is a simulation and the user can’t take control over any car.
Well, let’s dive into the code:
Above is the project solution explorer. As you can see, there are only a few classes. I will give a brief explanation of what each class does specifically.
This class has two methods: one for selecting a camera position and another for initializing the camera. The code is very simple.
public class Camara
public void SelectCamara(int camara)
Glu.gluLookAt(2, 3, 14, 2, 0, 5, 0, 1, 0);
Glu.gluLookAt(-2, 7, 10, 1, 3, 1, 0, 1, 0);
Glu.gluLookAt(0, 35, -15, 1, 0, -16, 0, 1, 0);
Glu.gluLookAt(3, 3, -47, 1, 0, 1, 0, 1, 0);
public void SetPerspective()
Glu.gluPerspective(55, 1, 0.1f, 1000);
A 3D model is a set of meshes and this car is not an exception. In this class I make a little tweak to draw the car. I draw the tires and the rims separate from the car because they have a
rolling movement besides a displacement movement. Then I make a list of the meshes that roll and calculate their pivot point which is its center and insert it to a separate list.
When I draw a car, I draw the chassis, accessories, and the tires separately.
The chassis takes the color of the car, the accessories are the same in the three cars, and the tires and rims go in a list because I rotate them.
This portion of code goes on the drawing function of the car and contains the race logic:
if (Controller.StartedRace == true)
Gl.glTranslatef(0, 0, traveledDistance);
if (traveledDistance > -59)
tireAngle -= 24;
traveledDistance -= speed;
if (Controller.FinishedRace == false)
Controller.FinishedRace = true;
if (counter == 30)
counter = 0;
speed = 0.2f + (float)randomizer.NextDouble() / 20f;
If the race has started, then in each frame I translate the car on the Z axis
through the traveled distance which increases by adding a number called speed, and every 30 frames I randomize that speed. This will keep the race interesting giving
the same shots to every car to win the race.
This class is for drawing the skybox and the terrain (not the road). As you will see later on the project, it is very simple..
This class draws the road and the begin and end line. For drawing the road, I made a
for loop drawing quads containing the texture of the road.
This class manages the drawing of the entire scene as well as methods to restart the race, querying which cars go first, among others.
This form is where everything is drawn; it has a timer which draws the scene at a regular interval and the buttons to select the cameras and to restart the race. Inside the code, you will
find the graphics initialization function, the lighting setup, the resize screen algorithm, etc.
Well I hope you find this project useful. If you like stuff like this, you can visit my blog at www.vasilydev.blogspot.com for more.