我正在尝试让我的游戏在主游戏类之外加载编译的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);
}
}
}
答案 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
,如果您添加它也会感到困惑。