如何在运行时加载游戏类之外的已编译的.xnb资源?

时间:2013-01-11 21:54:09

标签: c# xna runtime

我正在尝试让我的游戏在主游戏类之外加载编译的xnb纹理,就像我通常使用我的图像文件(没有编译成xnb格式)那样它并不起作用。

Texture2D.FromStream返回“意外错误”,

using (var g = new Game1())
{
    Texture2D t2d = g.Content.Load<Texture2D>(file);
}

表示该文件不存在,而紧挨着它的File.Exists表明它确实存在。

我无法将这些xnb文件添加到我的项目中,因为我不会在编译时使用它们。我该如何解决这个问题?


更多代码:

public void LoadXNA(Microsoft.Xna.Framework.Content.ContentManager cmgr, string path)
{
    string xnaTexturesPath = path.Substring(0, path.LastIndexOf("\\")) + "\\textures xna";

    if (Directory.Exists(xnaTexturesPath))
    {
        var files = Directory.GetFiles(xnaTexturesPath, "*.xnb");

        foreach(var file in files)
        {
            string filename = Path.GetFileNameWithoutExtension(file);

            string ext = Path.GetExtension(file);
            string pathNoext = file.Replace(ext, "");

            var t2d = cmgr.Load < Texture2D > (pathNoext);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您不需要整个Game。您所需要的只是GraphicsDevice。请注意,纹理绑定到图形设备 - 因此它必须在纹理时保持存在 - 并且纹理不能在多个设备之间共享。

要获得没有ContentManager课程的Game,请查看XNA WinForms Sample。特别是,它显示了如何创建绑定到给定控件的GraphicsDevice(可以是Form - 如果您不需要使用它,可以将其设置为隐藏的,否则如何)制作服务提供商并在其中添加IGraphicsDeviceService,然后如何使用该服务提供商创建ContentManager

或者,看看this answer,它提供了一些你可以直接使用的代码(它在同一个WinForms示例中使用了一些类)。它是XNA 3.1,因此可能需要对4.0进行微调,但通常应该可以正常工作。

Texture2D.FromStream无法加载XNB文件。 XNB文件需要通过ContentManager运行才能基本上“解开”所有XNB内容。

您遇到ContentManager.Load时遇到的问题可能是因为您在文件名中包含了文件扩展名。它会为您添加.xnb,如果您添加它也会感到困惑。