【问题标题】:Monogame Ambiguous Vector2Monogame 模棱两可的 Vector2
【发布时间】:2014-02-18 07:36:13
【问题描述】:

我遇到了一个问题,即在 Monogame 和 XNA 库之间不断出现歧义错误。无论我做什么,我都无法编译它。我已经从我的计算机上删除了 XNA,但错误仍然存​​在。完整的错误是:

Error   4   Argument 1: cannot convert from 'Microsoft.Xna.Framework.Vector2 [c:\Program Files (x86)\MonoGame\v3.0\Assemblies\WindowsPhone\x86\MonoGame.Framework.dll]' to 'Microsoft.Xna.Framework.Vector2'

在以下行中:

        EngineGlobal.world = new World(new Vector2(0,9.8f), false);

有人对如何摆脱冲突有任何建议吗?我想继续在 monogame 而不是 XNA 上进行开发,因为代码将被移植到 Android、iPhone 等的 MonoGame 环境中。

非常感谢任何帮助!

【问题讨论】:

  • 那么World 是在哪里声明的?在同一个项目还是不同的项目?
  • 同一个项目。它是一个静态 b2World 引用(在 XNA 实现中重命名为 world)
  • 不清楚您所说的“在 XNA 实现中重命名为 world”是什么意思 - 但我建议您非常仔细地查看构造函数的第一个参数是如何声明的,以及它真正引用的是什么类型。
  • 问题是 FarseerPhysicsPortable 错误地重新声明了Microsoft.Xna.Framework.Vector2

标签: c# xna monogame farseer


【解决方案1】:

我的回复有点晚了,但是如果你看看 MonoGame 项目模板是做什么的,你会发现在 csproj 文件中定义了一个额外的构建目标。

在我的例子中添加这个:

<Target Name="MonoGame_RemoveXnaAssemblies" AfterTargets="ImplicitlyExpandTargetFramework">
<Message Text="MonoGame - Removing XNA Assembly references!" Importance="normal" />
<ItemGroup>
  <ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.dll'" />
  <ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.GamerServices.dll'" />
  <ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.GamerServicesExtensions.dll'" />
  <ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.Input.Touch.dll'" />
  <ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.MediaLibraryExtensions.dll'" />
</ItemGroup>

引用不明确的 csproj 解决了这个问题。

【讨论】:

    【解决方案2】:

    这种错误几乎总是与引用有关。如果您绝对确定它没有引用 XNA,它可能引用了不同版本的 MonoGame。

    尝试从所有项目中删除所有 MonoGame 和 XNA 引用并重新引用它们。这包括已经用 XNA 编译的项目。它们可能需要重新编译。

    【讨论】:

      【解决方案3】:

      据我所知,Farseer 已被编写为可在多个平台上运行。它(部分)通过条件编译来完成这一点。

      我注意到在 Farseer 解决方案中重新定义了几种 XNA 类型,但使用的是原始 Microsoft XNA 命名空间。

      这通常不是问题,因为这些定义在 XNA 桌面、Windows Phone 和 XBox 等平台上被排除在外。

      但是,当 Farseer 与意想不到的平台:MonoGame 一起使用时,这确实会成为一个问题。

      为了解决这个问题,我只是下载了源代码并删除了带有 XNA 重新定义的文件。

      交替

      如果您正在使用源代码,您应该能够通过定义以下任一条件编译符号来防止这些定义被编译:

      • XNA
      • WINDOWS_PHONE
      • XBOX
      • ANDROID

      这可以在您项目的属性的 Build 选项卡中完成。

      或者更好的是,定义一个MONOGAME 符号并将其添加到条件编译行:

      #if !XNA &amp;&amp; !WINDOWS_PHONE &amp;&amp; !XBOX &amp;&amp; !ANDROID &amp;&amp; !MONOGAME

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2011-04-20
        • 2011-09-07
        • 2011-01-09
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多