在运行时将图像加载到内容管道

时间:2014-02-24 21:23:24

标签: c# xna xna-4.0

我正在制作游戏的关卡编辑器,我不想做“内容 - >添加并选择图像/精灵/纹理”,然后执行Texture2D texture1 = Content.Load<Texture2D>(@"path\name");,我想要通过OpenFileDialog将我需要的每个纹理添加到我的项目中。

我已经实现了OpenFileDialog,所以当我有一个带有我的图像的文件流时,我就到了。现在,如何在我的内容文件夹中加载纹理永久? (所以我会有.xnb文件?)

我读过要使用函数Texture2D.FromStream(GraphicsDevice, filestream);,但这不会在我的文件夹中创建.xnb文件;我只需要与通常的加载纹理方式相同的东西,使用“content-&gt; add”,ecc。

谢谢!

1 个答案:

答案 0 :(得分:4)

我建议只生成一个文件,该文件记录了要加载的游戏的所有资源。我已经停止依赖XNA内容项目模板,因为它要求您非常慎重地考虑添加的每个资源,这不利于游戏开发的快速原型设计。

当您的编辑器启动时,它会读取文件(包含您需要的每个资源的路径),并在每次打开新纹理时(从对话框中)附加到此文件,然后加载该纹理。这样,下次项目运行时,您的游戏将自动加载已添加的每个资源。你如何管理过大的资源缓存以及它何时加载和卸载取决于你,但我已经体验过这个更有效。

如果你担心包装,你也可以设置一些简单的压缩来装箱你的纹理和声音。

//This will just load all textures from a folder,
// and works well enough if you want to keep your game open/moddable.
foreach (string str in Directory.GetFiles("resource\\texture\\","*.png", SearchOption.AllDirectories))
{
    int lastSlash = str.LastIndexOf('\\');
    string textureName = ((lastSlash > -1) ? str.Substring(lastSlash + 1) : str).Replace(".png","");
    Util.Log(LogManager.LogLevel.Debug, "Loading texture: " + str);
    textures[textureName]= Texture2D.FromStream(context.GraphicsDevice, (Stream)File.OpenRead(str));
}