Game Components

XNA has a really nice way to integrate different logical pieces of code (such as your soon-to-be-created SpriteManager class) into your application. The GameComponent class allows you to modularly plug any code into your application and automatically wires that component into the game loop's Update call (i.e., after your game's Update call is made, all associated GameComponent classes have their Update methods called).

Create a new game component by right-clicking on the project in Solution Explorer and selecting Add → New Item. Select Game Component as the template from the list on the right side of the window, and name the game component file SpriteManager.cs.

Looking at the code generated for your new game component, you will notice that it contains constructor, Initialize, and Update methods. Also, the class derives from GameComponent.

If you want to create a game component that will also be wired into the game loop's Draw method so that your component has the ability to draw items as well, you can do so by instead deriving from the DrawableGameComponent class.

You're going to be using your sprite manager to invoke the Draw methods of all the sprites it manages, so you'll need to have this game component wired up to the game's Draw method. Change the base class of your game component to DrawableGameComponent to enable this functionality:

public class SpriteManager : Microsoft.Xna.Framework.DrawableGameComponent

After changing the base class, you'll need to create an override for the Draw method in your game component:

public override void Draw(GameTime gameTime)
{
    base.Draw(gameTime);
}

To add your newly created component to your game and have the Update and Draw methods in your component wired into your game loop, you also have to add the component to the list of components used by your Game1 class. To do this, you'll need to add a class-level variable of the type SpriteManager to your Game1 class:

SpriteManager spriteManager;

Then, in your Game1 class's Initialize method, you need to instantiate the SpriteManager object, passing in a reference to your Game1 class (this) to the constructor. Finally, add the object to the list of components in your Game1 class:

spriteManager = new SpriteManager(this);
Components.Add(spriteManager);

Bam! You're wired up and ready to go. When the Update and Draw methods of your game are called, they will also now be called in your new game component.

You can see how easy it is to add a GameComponent to your game. Imagine the possible uses for this kind of tool. If, for example, you built a component to draw the framerate and other performance-related debug information on the screen, you could add it to any game with only two lines of code! Very cool stuff.

Get Learning XNA 3.0 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.