Click here to Skip to main content
15,037,168 members
Articles / Multimedia / OpenGL
Article
Posted 7 May 2012

Tagged as

Stats

41K views
3.9K downloads
36 bookmarked

A New Version of My 3D Asteroid Game in OpenGL with C#

Rate me:
Please Sign up or sign in to vote.
4.95/5 (12 votes)
14 May 2014CPOL3 min read
A new version of the asteroid game
This article is an update of my first article named “A Basic 3D Asteroid Game in OpenGL with C#” with the shooting feature added.

Image 1

Introduction

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. In the first version of this updated article, the spaceship contained a mesh for the four rockets, I didn't know how to de-attach them in a 3D editor so I made the ship fire the four rockets at the same time. Then, the user The_inventor sent me the 3D file with each rocket in an individual mesh so I decided to rewrite this article in order to include those changes. Now each missile is fired individually.

The first thing to do is to get the meshes that contain the four rockets and place them on a list:

C#
m = ContentManager.GetModelByName("nave.3DS");
m.CreateDisplayList();

missiles.Add(new Missile(new Vector3(),m.GetMeshWithName("Missle1")));
m.RemoveMeshByName("Missle1");

missiles.Add(new Missile(new Vector3(), m.GetMeshWithName("Missle2")));
m.RemoveMeshByName("Missle2");

missiles.Add(new Missile(new Vector3(), m.GetMeshWithName("Missle3")));
m.RemoveMeshByName("Missle3");

missiles.Add(new Missile(new Vector3(), m.GetMeshWithName("Missle4")));
m.RemoveMeshByName("Missle4");

After getting the mesh reference, we delete them from the model because we are going to draw and manage them in a different way than the ship.

C#
//This is the function that draws a missile

        public void Draw()
        {
            if (fired == false)
                initialPos = shipPos; 

            Gl.glPushMatrix();
            if (fired)
            {
                initialPos.Z -= 0.1f;
                Gl.glTranslatef(initialPos.X, initialPos.Y, initialPos.Z);
                if (Math.Abs(initialPos.Z) > 35)
                {
                    fired = false;
                    initialPos = shipPos;
                }
            }
            else
            {
                Gl.glTranslatef(shipPos.X, shipPos.Y, shipPos.Z);
            }

            AsteroidGenerator.CheckCollisionMissile(initialPos, 0.5f);

            Gl.glScalef(0.3f, 0.3f, 0.3f);
            Gl.glDisable(Gl.GL_TEXTURE_2D);
            //Dont have a missile texture
            //Gl.glBindTexture
            //(Gl.GL_TEXTURE_2D, ContentManager.GetTextureByName("avion07.jpg"));
            missileMesh.Draw();
            Gl.glEnable(Gl.GL_TEXTURE_2D);  
            Gl.glPopMatrix();
        } 

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 in the following way. When a missile is shot, it checks if it is colliding with any asteroid. It does it the same way in which 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 is drawn, 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 eight classes, two added for this feature:

  • ExplosionWave.cs: This is the 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 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.
  • Missile.cs: This class handles the drawing and logic of the missiles.

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.

History

  • 14th May, 2014: Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Vasily Tserekh
Software Developer
United States United States
Born on 86, had my first computer at the age of 8, wrote my first code at the age of 15(pascal), began to study software engineering at 2005 and graduated in 2010. I have a dev blog www.vasilydev.blogspot.com. My real passion is 3D game programming and playing guitar. I've programmed stuff in C#, python, Delphi, PHP, C++, JS, QT and others...

Comments and Discussions

 
QuestionSources not available Pin
dekortix2-Apr-19 20:02
Memberdekortix2-Apr-19 20:02 
QuestionPlease also delete your article if you delete files! Pin
Member 139774062-Jan-19 15:46
MemberMember 139774062-Jan-19 15:46 
An empty zip file is just useless
QuestionFile not found Pin
Member 115918336-Nov-16 20:43
MemberMember 115918336-Nov-16 20:43 
GeneralMy vote of 5 Pin
Volynsky Alex14-May-14 23:49
professionalVolynsky Alex14-May-14 23:49 
NewsNew Model file Pin
The_Inventor22-Apr-14 19:27
MemberThe_Inventor22-Apr-14 19:27 
GeneralRe: New Model file Pin
Vasily Tserekh23-Apr-14 11:27
MemberVasily Tserekh23-Apr-14 11:27 
GeneralRe: New Model file Pin
The_Inventor28-Apr-14 17:26
MemberThe_Inventor28-Apr-14 17:26 
GeneralRe: New Model file Pin
Vasily Tserekh29-Apr-14 10:16
MemberVasily Tserekh29-Apr-14 10:16 
GeneralRe: New Model file Pin
The_Inventor16-May-14 16:40
MemberThe_Inventor16-May-14 16:40 
GeneralRe: New Model file Pin
Vasily Tserekh17-May-14 4:32
MemberVasily Tserekh17-May-14 4:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.