我已经安装了 Delphi Prism 和 XNA Game Studio 3.0。我已成功翻译为 Delphi Prism XNA 教程 1“在屏幕上显示 3D 模型”(http://msdn.microsoft.com/en-us/library/bb197293.aspx)。项目编译良好,但我无法加载模型。看起来XNA中有一个新的“contentproj”类型不在Delphi Prism中......知道如何让它工作吗?
5 回答
您可以使用 msbuild 手动构建内容项目。它可能没有相同的集成,您可以在解决方案资源管理器中添加内容和更改设置......但它会成功:-)
这是有关此的更多信息:http: //blogs.msdn.com/shawnhar/archive/2006/11/07/build-it-ahead-of-time.aspx
我终于设法通过 1)从命令行使用 MSBuild 构建“* .contentproj”,2)将生成的“内容”目录作为输出我的 Delphi Prism 可执行文件的子目录来使其工作。
让 Delphi Prism 自动识别 *.contentproj 并自动构建它会很好。
我还没有做过任何 XNA 的东西,但这是我最好的猜测 :-)
因此,Content Project 类型是标准 XNA 项目的子项目,它只是将游戏内容(纹理、声音等)编译为嵌套编译过程,对吗?
所以我假设在项目文件或解决方案文件中必须有对子项目的引用,也许最好的方法是在 C# 或 VB 中创建一个简单的 XMA 项目并查看生成的元文件( csproj、contentproj 等)
编辑:
哦,我在这里建议您手动创建 contentproj 文件并插入引用,一旦您知道它们的样子,我假设 VS 将允许您添加、删除您的内容等
然后剩下的问题是 XNA 内容管道编译过程是如何被触发的,如果它不是“刚刚发生”,这可能是 marc hoffman 等人的问题
希望这会有所帮助,这只是一个猜测。
顺便说一句,很高兴在 StackOverFlow 见到你。
Rgds 蒂姆·贾维斯。
据我所知,Prism 只是公布了,没有发布。因此,试验不是最终产品。作为 RO 客户,我希望收到一封电子邮件,但不会在此之前发布,除非是发布它。坦率地说,我不知道 XNA 支持已经完成,甚至还没有工作。考虑到 Prism 的正式发布最快还有将近一个月的时间,你尝试这个可能还为时过早。
我不知道该告诉您如何解决 XNA 的问题,但等待 Prism 本身是明智的。在 Prism 发布之前,我会认为 XNA 支持“待定”。
System.reflection 可用于访问 XNA 的内部工作以创建 xnb 文件
method Game1.LoadContent;
var
importer : TextureImporter;
texContent : Texture2DContent;
cc : ContentCompiler;
fullPath : String;
fs : FileStream;
args : array[1..7] of System.Object;
begin
spriteBatch := new SpriteBatch(GraphicsDevice);
importer := new TextureImporter;
texContent := importer.Import(’asset.png’, nil) as Texture2DContent;
var compilerType := typeOf(ContentCompiler);
cc := compilerType.GetConstructors(BindingFlags.NonPublic or BindingFlags.Instance)[0].Invoke(nil) as ContentCompiler;
var compileMethod := compilerType.GetMethod("Compile", BindingFlags.NonPublic or BindingFlags.Instance);
fullPath := ‘assestName.xnb’;
fs := File.Create(fullPath);
args[1] := fs;
args[2] := texContent;
args[3] := TargetPlatform.Windows;
args[4] := GraphicsProfile.Reach;
args[5] := true;
args[6] := fullPath;
args[7] := fullPath;
compileMethod.Invoke
(
cc,
args
);
//SpriteTexture := Content.Load(’assetName’);
end;