我正在为我正在构建的 XNA 游戏构建一个游戏编辑器,该游戏将接受 JPEG/PNG,并输出一个包含 Texture2D 内容的 XNB 文件。
我有用于我的自定义等的自定义序列化程序,我正在挖掘所有内容以使用反射等调用 ContentCompiler,进入真正的脏位,我实际上可以让这部分为我自己的格式工作。但是我现在需要序列化为 XNA 知道如何编译的常规 Texture2D 格式(在构建项目时在 Visual Studio 中)和加载(在游戏中使用最常用的 Content.Load 方法。我不想制作自己的图像这显然是文件格式。当我尝试编译 Texture2D 时,它不会给我一个错误,它会创建 XNB 文件,但文件内容不是图像数据,它只是大约 3-4 KB 的开销(我认为是 Texture2D 对象的其他非图像属性)。
这是我用于编译的代码:
protected void InitializeWriter()
{
Type compilerType = typeof(ContentCompiler);
cc = compilerType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0].Invoke(null) as ContentCompiler;
compileMethod = compilerType.GetMethod("Compile", BindingFlags.NonPublic | BindingFlags.Instance);
}
internal void Write(string objectName, string path, object objectToWrite)
{
if (basePath == null)
{
throw new InvalidOperationException("The base path to write has not been set.");
}
if (cc == null) { InitializeWriter(); }
string fullPath = Path.Combine(basePath, path, objectName + ".xnb");
using (FileStream fs = File.Create(fullPath))
{
compileMethod.Invoke(cc, new object[]{
fs, objectToWrite, TargetPlatform.Windows, GraphicsProfile.Reach, false/*true*/, fullPath, fullPath
});
}
}
我有自己的内容处理器,这段代码可以完美地与它们配合使用。这只是调用 ContentCompiler 的 Compile 方法,但使用了反射(因为它是一个内部类)。
我不明白为什么 Texture2D 会序列化,但没有实际的位图数据。
编辑 对不起,它不编译Texture2D(它抱怨我的GraphicsDevice的循环引用),如果我尝试编译一个Bitmap对象,它编译没有错误但不序列化实际的位图数据)