0

我试图让我的游戏在主游戏类之外加载已编译的 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);
        }
    }
}
4

1 回答 1

1

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

要获得ContentManager没有课程的Game课程,请查看XNA WinForms Sample。特别是,它展示了如何创建GraphicsDevice到给定控件的绑定(可以是Form- 如果您不需要使用它,可以将其隐藏),如何创建服务提供者并将 aIGraphicsDeviceService放入其中,然后是如何ContentManager使用该服务提供者创建一个。

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

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

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

于 2013-01-12T11:53:15.053 回答