Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load all files in a folder with XNA?

Tags:

c#

xna

I want to load all files in a folder "Content/textures" into the game using Content.Load("filename");

However, I am unable to "find" files located inside Content this way (the program rather looks at "bin/debug/../Content/textures", but I get an error when trying to load the jpg/png files there with Content.Load.

How can I achieve what I'm trying to do? I want to load all files in a folder inside Content (which content folder is the right one?) into the game, so that I dont have to specify every single texture.

Thanks.

like image 475
Alx Avatar asked Oct 16 '12 11:10

Alx


2 Answers

You can use this helper class to do this. It works by taking a given directory and using the GetFiles() method to create a list of all the textures that are needed to be loaded. It then loads them as normal with your ContentManager, and puts them into a dictionary so you can use them.

 public static class TextureContent
    {
        public static Dictionary<string, T> LoadListContent<T>(this ContentManager contentManager, string contentFolder)
        {
            DirectoryInfo dir = new DirectoryInfo(contentManager.RootDirectory + "/" + contentFolder);
            if (!dir.Exists)
                throw new DirectoryNotFoundException();
            Dictionary<String, T> result = new Dictionary<String, T>();

            FileInfo[] files = dir.GetFiles("*.*");
            foreach (FileInfo file in files)
            {
                string key = Path.GetFileNameWithoutExtension(file.Name);


                result[key] = contentManager.Load<T>(contentFolder + "/" + key);
            }
            return result;
        }
    }

Create a dictionary to store the textures, rather than line after line of Texture2Ds

  public Dictionary<string, Texture2D> spriteContent;

...And call the method in your LoadContent method

 spriteContent = TextureContent.LoadListContent<Texture2D>(content, "textures");

Now whenever you need a texture from it, just do:

Whatever.Image = spriteContent["WhateverTexture"]

Make sure the TextureName is the asset name of your texture.

like image 130
Cyral Avatar answered Nov 08 '22 18:11

Cyral


Content in XNA needs to be built with the content pipeline. It turns your .png files (and so on) into .xnb files. These are processed, binary content files that ContentManager can load into Texture2D instances at runtime.

(Note that you can load image files directly with Texture2D.FromStream - MSDN. However it does not premultiply alpha, which is what XNA's default rendering modes use.)

So first of all you have to get all your content files to build. The XNA Content Pipeline uses MSBuild. A project file in Visual Studio is an MSBuild file. So what you need to do is edit that project file by hand to build a set of files using a wildcard. There are instructions in this blog post, which is linked from this very similar question that I asked quite a while ago.

Built content files in XNA are simply stored in the file system, relative to your games's output directory. So use Directory.GetFiles to enumerate through the .xnb files in the directory. Then construct a path to load them from, relative to the content directory (ContentManager.RootDirectory), using their filename without an extension (which you can get with Path.GetFileNameWithoutExtension). Then, simply pass your constructed path to Content.Load<Texture2D> to load each one.

(Note that .xnb files can contain things other than textures. So you should take care that your directory only contains textures. Otherwise you need to catch the exception that ContentManager.Load<Texture2D> will throw.)

like image 40
Andrew Russell Avatar answered Nov 08 '22 18:11

Andrew Russell