11,501,561 members (75,112 online)

# A Basic 3D Asteroid Game in openGL with C#

, 30 Dec 2011 CPOL 42.1K 8.6K 56
 Rate this:
A Basic 3D Asteroid Game in openGL with C#

## Introduction

This article is intended for beginners who want to start with 3D game programming and don’t know where to start. It is programmed in Opengl using VS 2008 and a small graphic engine I made myself called Shadowengine. It has the basics of what a game should have: a Score, levels of difficulty and a life counter. All this is written in a small number of code lines, with the objective of being simple and understandable.

The first problem I had to achieve is the scene to look like outer space. For that issue, I set the background color to black. In opengl, it is set this way:

`Gl.glClearColor(0, 0, 0, 1);//red green blue alpha `

The other problem were the stars and I solve it by drawing random white points on the screen. The algorithm is more or less this way. I generate a random point and measure the distance to the spaceship, and if it is less than a predefined number, I discard it and repeat the process until it creates the desired stars. Look at the code:

```public void CreateStars(int cantidad)
{
Random r = new Random();
int count = 0;
{
Position p = default(Position);
p.x = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
p.z = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
p.y = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
if (Math.Pow(Math.Pow(p.x, 2) + Math.Pow(p.y, 2) +
Math.Pow(p.z, 2), 1 / 3f) > 15)
{
count++;
}
}
}```

The score is a number which increases over time and it grows faster everytime I pass a level. The level increases every 450 frames.

The last issue I had to address is the problem of asteroid collision. I make for the ship three positions (one for the ship and two for the wings) and every once in a while, I check the distance between all the asteroids and those three positions. If it is under a predefined value, I execute the collision event.

The project has 6 classes:

• 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 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:
```using System;
using System.Collections.Generic;
using System.Text;

namespace Naves
{
public class Controller
{
Camera camara = new Camera();
Star star = new Star();
SpaceShip spaceShip = new SpaceShip();
public SpaceShip Nave
{
get { return spaceShip; }set { spaceShip = value; }
}
public Camera Camara
{
get { return camara; }
}
public void BeginGame()
{
AsteroidGenerator.GenerateAsteroid(35, false);
}
public void ResetGame()
{
AsteroidGenerator.GenerateAsteroid(35, true);
spaceShip.Reiniciar();
}
public void CreateObjects()
{
star.CreateStars(450);
spaceShip.Create();
Asteroid.Crear();
}
public void DrawScene()
{
star.Draw();
AsteroidGenerator.DrawAsteroids();
spaceShip.Dibujar();
}
}
}```

Main.cs - This is the form which contains this visual components of the game. It contains the controller class and gives the player information through proper windows controls. It has a timer to periodically draw the scene and has the code for texture and object loading.

If you want to add sound to the project, uncomment the commented lines and press Ctrl+Alt+E and under managed debugging assistants, uncheck the loaderlock exception.

I am hoping to receive feedback from this example. If you like it, you can visit my blog at www.vasilydev.blogspot.com for more stuff like this. I’ll try to make a version where the spaceship can shoot at the asteroids.

## History

• 28th December, 2011: Initial version

## Share

Software Developer
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 informatic engineering at 2005 and graduated in 2010, now I am currently working on a software development department in my company. Working with extjs mysql and php. I have a dev blog www.vasilydev.blogspot.com. My real pasion is 3D game programming and playing guitar. Ive programmed stuff in C#, python, Delphi, PHP, C++, JS, QT and others...

 First Prev Next
 How is the texturas mapped to the nave.3ds? bitzhuwei15-Jun-13 21:30 bitzhuwei 15-Jun-13 21:30
 Re: How is the texturas mapped to the nave.3ds? Vasily Tserekh16-Jun-13 5:10 Vasily Tserekh 16-Jun-13 5:10
 Re: How is the texturas mapped to the nave.3ds? Vasily Tserekh16-Jun-13 5:14 Vasily Tserekh 16-Jun-13 5:14
 Re: How is the texturas mapped to the nave.3ds? bitzhuwei15-Jul-13 17:28 bitzhuwei 15-Jul-13 17:28
 Re: How is the texturas mapped to the nave.3ds? Vasily Tserekh17-Jul-13 4:25 Vasily Tserekh 17-Jul-13 4:25
 Little Tidbit/Suggestion [modified] Death2592-May-12 8:12 Death259 2-May-12 8:12
 Re: Little Tidbit/Suggestion Vasily Tserekh5-May-12 17:48 Vasily Tserekh 5-May-12 17:48
 yes its nice to see that you have improved it, i made the game for a school project and i hadnt have to improve it. But after all this feed back i am thinking seriously to add the shooting asteroid functionality. It is not so difficult, the first thing to do is open the ship in blender, 3d max or maya and find out the mesh names of the missiles. When you load the ship you create a list of missiles getting those meshes from the ship file and then erasing them from the 3d file for paint it individually. if you manage to do that i will tell you what you have to do in order to add the firing missile feature, BTW you can take a look at how i get get a mesh from a 3d file in the car race demo i published here
 Re: Little Tidbit/Suggestion Death2597-May-12 6:52 Death259 7-May-12 6:52
 Re: Little Tidbit/Suggestion Vasily Tserekh7-May-12 9:11 Vasily Tserekh 7-May-12 9:11
 Re: Little Tidbit/Suggestion Death2597-May-12 9:17 Death259 7-May-12 9:17
 Re: Little Tidbit/Suggestion Vasily Tserekh8-May-12 6:03 Vasily Tserekh 8-May-12 6:03
 Re: Little Tidbit/Suggestion Death2598-May-12 6:04 Death259 8-May-12 6:04
 Is source code available? Perry217-Apr-12 8:08 Perry2 17-Apr-12 8:08
 Re: Is source code available? Death2592-May-12 8:16 Death259 2-May-12 8:16
 This is really cool! Larry Boeldt22-Mar-12 16:33 Larry Boeldt 22-Mar-12 16:33
 Re: This is really cool! Vasily Tserekh23-Mar-12 8:39 Vasily Tserekh 23-Mar-12 8:39
 My vote of 5 fredatcodeproject31-Dec-11 14:41 fredatcodeproject 31-Dec-11 14:41
 What .NET OpenGL Library Are You Using? BlazeCell30-Dec-11 5:38 BlazeCell 30-Dec-11 5:38
 Re: What .NET OpenGL Library Are You Using? J4\$PER30-Dec-11 8:46 J4\$PER 30-Dec-11 8:46
 Re: What .NET OpenGL Library Are You Using? GL_Terminator30-Dec-11 10:03 GL_Terminator 30-Dec-11 10:03
 Last Visit: 31-Dec-99 18:00     Last Update: 2-Jun-15 0:22 Refresh 1