This article is an update of my first article named “A basic 3D asteroid game
in OpenGL with C#”. In this version, I have added the shooting feature. I will try to explain it briefly here:
The first thing to do is to get the mesh that contains the rocket:
misiles = m.GetMeshWithName("avion07");
After getting the mesh reference, we delete it from the model because we are going to draw and manage it in a different way than the ship.
One drawback is that in the 3D model, the four rockets are recognized as a single mesh, that’s why when we shoot a missile,
all the four are shot. I don’t have too much knowledge of 3D
Max to make the four missiles as single meshes and that brings another complication; the missile position is the same for all, which means that we are
going to check collisions on one single point that is the center of the four missiles.
public void DrawMisile()
missilePos.Z -= 0.1f;
Gl.glTranslatef(missilePos.X, missilePos.Y, missilePos.Z);
if (Math.Abs(missilePos.Z) > 35)
misileShot = false;
missilePos = p;
Gl.glTranslatef(p.X, p.Y, p.Z);
Gl.glScalef(0.3f, 0.3f, 0.3f);
After getting the missile, the missile may only have two statuses: when it is in the ship and when
it is fired. If it is in the ship I don’t have to do anything, just translate
the missiles anytime I translate the ship.
I handle the missile asteroid collision the following way. When a missile is shot, it checks if it is colliding with any asteroid. It does it the same way that the
ship checks collisions with the asteroids but it does another thing: if a collision is detected, the asteroid
generator class which holds the asteroid
list is told to delete that asteroid and to create an explosion. An explosion is a sphere object that anytime it draws, it expands its size, giving the idea of
a shock wave, and then when a particular size is achieved, the object doesn’t draw anymore. Attention, this explosion wave follows some concepts of particle
programming, which is live over time and a particular way to behave.
The project has seven classes, one added for this feature:
- ExplosionWave.cs: This is the class that handles the explosion, it’s a sphere object drawn by
- AsteroidGenerator.cs: It handles the creation of asteroids in random places and with random sizes and speeds. It also has the method to
query whether or not there has been a collision between the spaceship and an asteroid.
- Asteroid.cs: It handles everything concerning an asteroid such as the movement, texture selection, drawing, among others.
- Star.cs: It has a method to create random white points and to draw them.
- Camera.cs: It handles the selection of the user camera and setting the right perspective view of the scene.
- SpaceShip.cs: This class contains all the methods and attributes regarding the spaceship, such as movement, drawing, etc.
- Controller.cs: This class manages the game creation, game logic, and contains all the classes needed to run the game. Here is a portion of the code.
This game is only for educational purposes. I think the simpler the code, the beautiful it
gets. Of course there are a lot of things that you may improve like the diagonal moving suggestion made by the user
Death259 that I included in this version. I also added points to the score when an asteroid is destroyed.
I am hoping to receive feedback from this example. If you like it, you can visit my blog www.vasilydev.blogspot.com for more stuff like this.