Click here to Skip to main content
15,867,453 members
Articles / Programming Languages / C#
Article

Invasion - C# Style

Rate me:
Please Sign up or sign in to vote.
4.76/5 (40 votes)
28 Jan 2003CPOL4 min read 246.4K   3.1K   101   52
This "Space Invaders" - like game was ported to C# using the new DirectX9 to demonstrate the ease of managed DirectX.

Title Screen Middle of the game

Introduction

DirectX has changed quite a bit over the years and the new DirectX 9 offers some new things that previous versions never did.  DX9 provides new functionalities for enhanced 3D manipulations.  But one big change is the addition of a managed DirectX so that you can create applications using a .Net language and still tie into DirectX.  This is without having to work around a COM Interoperability issue.  DirectX9 directly supports managed code and makes life for the DirectX/C# developer much simpler in the long run.  The Managed DirectX classes include a DirectDraw set of classes to use for 2D manipulation.  This 2D interface is not a new version of DirectDraw - it is a wrapper to get to the DirectDraw7 interface.  This is good for a lot of developers that still want to do 2D games and also want to use a .NET language.

The DirectX SDK can be obtained from Microsoft at http://msdn.microsoft.com/directx/

Ok, enough of an introduction, let's get to the code...

The Graphics

One of the first things that I did was to convert the BMP files into PNG.  I did this for a couple of reasons.  The first is that PNG files are smaller, so that having them embedded into the executable directly will not increase the file size as much as bitmaps would.  The second reason is to demonstrate that other file formats can be used to create surfaces from.  This is not directly in DX9, but there are C# classes to read the data in correctly.  I had converted to JPG at first, but the quality setting was too low and the images did not look as good. 

Handling error codes from the calls to methods like Draw are different from DX8 too.  There is not a returned error code, just a try/catch to get the errors.

C#
try
{
    back.Draw(new Rectangle(150, 275+(40 * iOption),32,20), 
              Selected, rcRect, DrawFlags.DoNotWait | DrawFlags.KeySource);
}
catch(SurfaceLostException)
{
    RestoreSurfaces();
}

The Sounds

Sounds ended up being a very simple thing overall, but I did have a few problems with it.  At first, the samples for using DirectSound seemed simple enough until you notice that the Device class that DirectSound uses is the same class name that DirectDraw uses.  This meant that I had to fully qualify the class names when I created those variables.

C#
Microsoft.DirectX.DirectDraw.Device displayDevice;
Microsoft.DirectX.DirectSound.Device soundDevice;

To create the SecondaryBuffer objects to play the sounds, I decided to use a stream from the executable to get WAV files into the buffers.  To do this a GetManifestResourceStream was used.  The problems that I had here were that the resource had to be fully qualified with the assembly name too.

C#
try
{
    SkidBuffer = new SecondaryBuffer(
              loadedAssembly.GetManifestResourceStream("Invasion.skid.wav"), 
                                     soundDevice);
}
catch(SoundException)
{
    Console.WriteLine("load sounds error 1");
}

Rest of the Conversion

Overall, the remaining parts that needed to be converted went smoothly.  I removed the linked lists in favor of the ArrayList class.  This really cleaned up the code when it came time to add/remove UFOs, bullets, and extras.  You could argue that using a vector from STL would clean up the handling of the linked list too or the use of some other type of container class.  I agree that is the reason for the conversion.

One of the tricky parts of converting an application from C++ to C# is remembering all of the little differences between the languages.  For example, in C++ you can use rand() to generate a random number.  For C#, random numbers are generated with an instance of the Random class.  This works just great, except for one thing.  I originally setup each UFO with its own random variable.  This worked just fine until I realized that each UFO was getting the same random numbers.  This is because the instance of Random, seeds the variable with the current time.  This meant that the separate UFO variables would get a random number generator all seeded with the same time.  Each of the random generators created the exact same numbers.  Once I moved the random number generator to the Invasion class, then each UFO had its own values and things worked as expected. 

Debugging

Debugging a fullscreen DirectX application is always a tricky thing to do.  For this conversion, Console.Writeline was used to print out data to the debug window. Unhandled exceptions were the root of most of the crashes that were experienced; this includes InvalidRectangleException as the biggest problem.  This seems very important with Managed DirectX to handle all exceptions with a try/catch.  A second display could have been used to make things simpler, but having the output in the debug window after the crash was good enough to fix the issues. 

History

The original code for this game came from Invasion - A computer game using DirectDraw by Mauricio Ritter.  It is a great little game that had all of the right graphics and unlimited game play.  Mauricio did a great job, so I made sure to leave his name in the credits.

License

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


Written By
Software Developer (Senior) InfernoRed Technologies
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionThe Port to Windows Phone in C# and XNA is DONE! Pin
Dan Colasanti30-Jun-11 20:41
professionalDan Colasanti30-Jun-11 20:41 
QuestionI add a windows7 multi-touch feature into your game ,do you have interest to add the feature in your program? Pin
David_Ke20-Jan-10 20:21
David_Ke20-Jan-10 20:21 
AnswerRe: I add a windows7 multi-touch feature into your game ,do you have interest to add the feature in your program? Pin
Steve Maier28-Aug-10 7:40
professionalSteve Maier28-Aug-10 7:40 
GeneralNew version soon Pin
Steve Maier31-Aug-06 8:08
professionalSteve Maier31-Aug-06 8:08 
GeneralShooting UFO bullets Pin
JohnDonaldson22-Feb-06 6:38
JohnDonaldson22-Feb-06 6:38 
GeneralRe: Shooting UFO bullets Pin
Steve Maier22-Feb-06 17:22
professionalSteve Maier22-Feb-06 17:22 
GeneralRe: Shooting UFO bullets Pin
JohnDonaldson24-Feb-06 7:25
JohnDonaldson24-Feb-06 7:25 
Generalslow! Pin
Keimax21-Jan-06 1:11
Keimax21-Jan-06 1:11 
Hi!

The game runs very slow?
Is this normal? Solution?
Thanks!!!

Keimax
c# noob

GeneralRe: slow! Pin
Steve Maier22-Jan-06 10:13
professionalSteve Maier22-Jan-06 10:13 
GeneralRe: slow! Pin
sontek30-Mar-06 11:14
sontek30-Mar-06 11:14 
GeneralRe: slow! Pin
Steve Maier30-Mar-06 15:21
professionalSteve Maier30-Mar-06 15:21 
GeneralRe: slow! Pin
mitsubishiuk6-May-06 11:28
mitsubishiuk6-May-06 11:28 
GeneralCan't Play and DirectX reference not found Pin
kenexcelon1-Mar-05 16:01
kenexcelon1-Mar-05 16:01 
GeneralRe: Can't Play and DirectX reference not found Pin
Steve Maier1-Mar-05 18:13
professionalSteve Maier1-Mar-05 18:13 
GeneralTransparency Pin
arkam7-Dec-04 21:59
arkam7-Dec-04 21:59 
GeneralRe: Transparency Pin
Steve Maier8-Dec-04 2:26
professionalSteve Maier8-Dec-04 2:26 
GeneralRe: Transparency Pin
rajshukla12317-Sep-05 0:32
rajshukla12317-Sep-05 0:32 
Generalfront.Draw V's front.Flip Pin
exhaulted3-Nov-04 22:12
exhaulted3-Nov-04 22:12 
GeneralNext Version Pin
Bassam Abdul-Baki21-Oct-04 15:05
professionalBassam Abdul-Baki21-Oct-04 15:05 
GeneralRe: Next Version Pin
Steve Maier21-Oct-04 16:36
professionalSteve Maier21-Oct-04 16:36 
GeneralRe: Next Version Pin
Bassam Abdul-Baki22-Oct-04 3:43
professionalBassam Abdul-Baki22-Oct-04 3:43 
GeneralRe: Next Version Pin
Steve Maier22-Oct-04 7:01
professionalSteve Maier22-Oct-04 7:01 
GeneralRe: Next Version Pin
Bassam Abdul-Baki22-Oct-04 7:41
professionalBassam Abdul-Baki22-Oct-04 7:41 
GeneralDirectInput vs NET Form event handers Pin
Mark Austin17-Sep-04 8:37
Mark Austin17-Sep-04 8:37 
GeneralRe: DirectInput vs NET Form event handers Pin
Steve Maier17-Sep-04 9:00
professionalSteve Maier17-Sep-04 9:00 

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.