Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm writing a 2D room-based* platformer using XNA, and I'm trying to figure out the best way to load resources based on what the current map requires. Basically, I need to (want to) dispose of the loaded tileset/textures and load just the ones the next map requests at every transition (ideally, I'll check if they're actually different first), without killing off the more universal textures (player sprites, etc.).

I've seen a few forum posts saying the best way to do this is to create a second instance of ContentManager, but they never go into detail on how to do this correctly.

Currently, my XML map files each contain strings with the filenames of all necessary assets. I was planning on having my XmlReader method load the textures as their names were read, but then I realized I knew neither how to instantiate the second ContentManager, nor where to instantiate it--i.e., should it be in the MapFactory class that's loading the map, or in the static LevelManager that's calling the MapFactory (passing the new ContentManager as a parameter to the MapFactory, along with the name of the desired map)?

Alternatively, is there a simpler/cleaner way to do this? I'm more concerned with the code being easily comprehensible than efficient right now, as this is my first attempt at this kind of game.

*Ex. Castlevania, Metroid, but simpler (for now). I'd like to implement constant streaming eventually (chunks loaded as they are approached), but I want to get this part down first.

UPDATE: Instantiated the second ContentManager using this.Services inside the Game class (it was the only way I could find to get access to Game.Services, which is what everywhere online says to use in the ContentManager constructor). Should have thought of that sooner. For anyone confused by this in the future, the full line of code is:

ContentManager myContent = new ContentManager(this.Services, "myContent")

share|improve this question
    
You can inherit from ContentManager and override Load method and implement it in a way that doesnt add anything to loadedAssets Dictionary, and add it to your own dictionary so that you can remove assets from there later (or use refleciton to remove assets from loadedAssets dictionary...) –  Kikaimaru Feb 13 '13 at 8:37
    
This answer suggests that deriving your own myContentManager class from the original is more complicated than necessary. I just figured out how to instantiate a new ContentManager, finally (in the Game class, using new ContentManager(this.Services, "Textures")). I'll pass that through to the LevelManager and into the MapFactory when new maps are loaded... I think. –  Sasquatch Feb 14 '13 at 0:17
    
Ehm, no it does not. "Either way you'll be creating a second instance of ContentManager (or a class derived from it)". But it may be easier, but you have to know form which contentmanager you want to load your assets - which you probably do. On the otherside with custom content loader, you would have to know when to unload specific assets, maybe counting how many instances you are using. –  Kikaimaru Feb 14 '13 at 8:38

2 Answers 2

You could create specific classes for each level which inherit from ContentManager, and use a LoadContent() method in each, to override the base LoadContent() call.

You might also want to look at XNA's GameComponent class which itself inherits IDisposable. If each level was defined as a drawable game component, handling the disposal of each texture tilemap would happen when the game component itself is disposed.

share|improve this answer

There's a couple ways that you can do this. One way, using the content manager is to create a second one that is specific to your level's data (just use the existing manager's properties in the constructor of the new one). Another way, is to not use the content manager at all and for Textures/audio/etc use the FromStream static method to create them and then use .dispose to delete them (Maybe make your own content manager from that).

In regards to your map, you could make a static method like LoadFromXML or have a constructor option that loads from a file. You could even go through the hard work of making a content importer/processor for your map

share|improve this answer
    
Yeah, I'm creating a second contentManager (named "mapContent" for clarity) to hold everything specific to whatever map is being loaded. If I understand correctly, I should be able to call Unload() on it to dump everything and reload just what the next map requests. And yeah, my MapFactory has a LoadXml(string filename) method that uses XmlReader to parse the file. –  Sasquatch Feb 15 '13 at 5:07

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.