将XNA+VB.Net游戏转换为MonoGame

4
我正在使用XNA和VB.NET编写一款策略游戏。这种技术组合似乎是个不错的选择,但在我决定切换到MonoGame(但保持VB.Net中的游戏逻辑)后,问题就出现了。
问题在于,MonoGame目前不支持VB.Net。我进行了一些研究,似乎有两个基本选项:
1. 将我的代码重写为C# 2. 编写一个小型的C#包装器,并将我的游戏逻辑代码转换为库
不用说,这两个选项都不太好。我错过了其他选项吗?我不介意投入相当的精力使这个东西在MonoGame中工作,但重写并不是一个选项。
我到目前为止的发现:
在浏览网页时,我偶然发现了适用于VB.Net的MonoGame模板。虽然它看起来就是我需要的东西,但即使运行一个普通的新项目后,它加载时仍会崩溃。然后我继续搜索错误,但离实际运行还差得远。
为了解释我的技术选择(因为有人会问): 为什么选择XNA?我以前用过它,我对它很熟悉,尽管它已经过时了,但它完全符合我的需求,应该还能使用几年。 为什么选择VB.Net?我有丰富的经验,并且我更喜欢它的语法,因为我正在编写一个相当大规模的策略游戏,保持代码的清晰和可理解性是至关重要的。 为什么不选C#?经验。我用C#工作了一年多,但它不自然。VB才是。

离题:学习另一种语言很有趣!离开你的主要语言可能很难,但这是值得的!(有一个vb到C#转换器可以帮助你:http://www.developerfusion.com/tools/convert/vb-to-csharp/) - joppiesaus
1
你说得完全正确!然而,我这次想要学习的“语言”是“策略游戏编程”。让游戏逻辑正常运行需要相当多的学习和思考,所以我不想把它与学习另一种语言混淆在一起。 至于转换器,那肯定是一个选择。谢谢! - Arides
有一些解决方案可以让XNA/Monogame与F#一起工作,特别是在内容管道方面,这可能适用于VB.Net,请参见http://neildanson.wordpress.com/2013/08/13/f-and-monogame-part-4-content-pipeline/。 - Phillip Trelford
太棒了!我成功让VB.Net模板运行起来了,现在我面临着处理MonoGame缺失的ContentPipeline的问题。我一定会尝试你的建议,Phil。谢谢! - Arides
1个回答

3
我找到了一个解决方案。一种相当简单的方法是使用我之前提到的MonoGame模板。这种方法存在一些小问题,但没有太大的问题。
问题#1:启动MonoGame项目时出错。 运行新的VB MonoGame模板项目后,启动时会抛出一个讨厌的错误(mscorlib.dll中的System.TypeLoadException)。这是因为模板引用了错误版本的MonoGame库(我正在使用Windows,并且有一个与项目链接的Android库)。 解决方案:从新项目中删除MonoGame引用,然后使用浏览器添加正确的版本。
问题#2:MonoGame中缺少内容项目。 MonoGame没有内容项目,而是一个名为“Content”的文件夹,它的行为就像项目一样。只需将XNA内容项目中的所有内容添加到此文件夹中即可。太棒了!
但它未能从未编译的内容文件(例如myFont.spriteFont)中加载声音和字体。对于MonoGame内容,必须使用来自XNA项目的已编译版本替换声音和字体文件。

还有一个小麻烦 - 每个内容文件必须标记为“始终复制”或“仅在更新时复制”(默认值为“从不复制”)。我没有真正找到一种方法可以一次性更改所有文件,但这并不需要太多时间。

问题#3:XNA项目自动解析导入。
XNA项目有一个“语法糖”的优势。直到我切换到mono之前,我从来没有看到过我的XNA项目中的单个代码行称为“导入”。我广泛使用此功能,拥有许多仅由几行组成并使用“列表”和“Vector2”等的小类。在移植到MonoGame后,由于缺少导入,我必须经历数百个编译错误。

我仍然想知道这是由XNA项目还是Visual Studio本身的某些其他配置引起的,但我必须说我喜欢它。如果您了解此事,请分享。

结论:
回顾一下,将代码移植到MonoGame的过程花费了我一个月的时间来弄清楚 - 但是当我最终拥有所有部分时,整个过程对于100多个源文件和100多个内容文件的项目仅需大约4小时。我想说,MonoGame的开发人员做得非常出色,修改模板以适用于VB.Net的那位先生也同样如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接