Pages

Monday, May 7, 2012

A new version of my 3D asteroid game in OpenGL with C#

 

This article is an update of my first article named “A basic 3D asteroid game in OpenGL with C#”. In this version I 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
Mesh misiles; //This goes as a class attribute

misiles = m.GetMeshWithName("avion07");
m.RemoveMeshByName("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 shot a missile 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.



//This is the function that draws the missiles

    public void DrawMisile()
    {
        Gl.glPushMatrix();
        if (misileShot)
        {
          missilePos.Z -= 0.1f;
          Gl.glTranslatef(missilePos.X, missilePos.Y, missilePos.Z);
                if (Math.Abs(missilePos.Z) > 35)
                {
                 misileShot = false;
                 missilePos = p;
             }
         }
         else
         {
             Gl.glTranslatef(p.X, p.Y, p.Z);
         }

         AsteroidGenerator.CheckCollisionMissile(missilePos, 0.5f);

         Gl.glScalef(0.3f, 0.3f, 0.3f);
         Gl.glBindTexture(Gl.GL_TEXTURE_2D,
 ContentManager.GetTextureByName("avion07.jpg"));
            misiles.Draw();
            Gl.glPopMatrix();
        }

After getting the missile the missile may only have two statuses: when is in the ship and when is fired. If 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 in 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 it 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 particular way to behave.

The project has 7 classes, one added for this feature
ExplosionWave.cs This is a class that  handles the explosion it’s a sphere object drawn by opengl quadrics.
AsteroidGenerator.cs It handles the creation of asteroids in random places and with random sizes and speeds. It also have the method to query wether or not  It have been a collision between the spaceship and an asteroid
Asteroid.cs It handles all 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 to set the right perspective view of the scene
SpaceShip.cs This class contains all 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 code
This game is only for educational purposes. I thinks the simpler the code the beautifull it gets. Of course there a lot of things that you may improve like the diagonal moving sugestion made by the user Death259 that I include in this version. I also add points to the score when an asteroid is destroyed.
here is the download link


http://fbe.am/6bh

5 comments:

  1. Nice post! Is this the first and only one?

    Have u tried Unity3D yet? I´d love to try your code on it.

    No twitter account to follow?

    Kind regards.

    ReplyDelete
  2. Hey,
    I'm loving this.
    Doing computer graphics at university and just starting to learn C# for kicks.
    Would love to take a look at your ShadowEngine. Is it publically available?

    ReplyDelete
    Replies
    1. yes it is, it is basically a set of functions that allows you to make 3d programs faster. if you browse this site you will find it.
      ps.

      Delete
  3. Hey, I'am new in 3d C#, would u tell me how to change 3d model in this project?
    Thank u

    ReplyDelete
  4. Hello, im getting the following error:
    An unhandled exception of type 'System.AccessViolationException' occurred in ShadowEngine.dll

    Could you make avaliable te source code of this dll?

    ReplyDelete