1

我正在玩 CocosSharp 和 Box2D。我正在尝试创建一个世界并为其添加一个地面主体。这是我的代码:

var gravity = b2Vec2.Zero;
gravity.Set(0f, -9.8f);

world = new b2World(gravity);
world.SetAllowSleeping(false);
world.SetContinuousPhysics(true);

var groundBodyDef = new b2BodyDef();
groundBodyDef.position.Set(0, 0);

var groundBody = world.CreateBody(groundBodyDef);

问题出现在最后一行。world.CreateBody(groundBodyDef)返回空值。

我查看了b2World.CreateBody 的实现,发现只有在 IsLocked 为真时才会返回 null。我的理解是,当世界在踩踏时,IsLocked 是真的。但是,我在运行我的代码时看到 IsLocked 实际上是错误的,但 CreateBody 仍然返回 null。

我看过的所有示例都遵循 b2World 的相同基本设置。有什么我想念的吗?

我正在 Android 模拟器上对此进行测试,如果这有什么不同的话。

编辑 5/27:在了解了有关该问题的更多信息后,我现在知道有一些我认为没有必要包含在原始问题中的重要信息。我错了。我使用 CocosSharp Visual Studio 模板来创建解决方案和项目。这就是整个事情在Android上不起作用的原因。我会在答案中解释。

4

1 回答 1

2

所以事实证明,我在 Android 上进行测试非常重要。CocosSharp 的 VS 模板没有将 box2d.dll 的引用添加到 Android 项目中。Windows Phone 和 iOS 项目都有参考,我上面的代码在这两个平台上都按预期工作。

Android 项目有一个 Box2dTest.dll 引用,我假设它是允许我的代码构建和运行的原因。

昨晚深夜,我终于找到了另一个问题,这个问题表面上看起来不是同一个问题,但提供了一个可行的答案。我需要将 CocosSharp.PCL.Shared Nuget 包安装到我的 Android 项目中。然而,这并不是道路的尽头。我开始从中得到构建错误。

因此,我对该问题的最终解决方案是将 CocosSharp.PCL.Shared Nuget 包的引用添加到单独的测试项目中,将包文件夹复制到我当前解决方案的包文件夹中,然后仅添加对 box2d.dll 的程序集引用. 它在 Nuget 包中添加的其他内容让我更加悲痛。

完成所有这些之后,我的代码就可以在 Android 上运行了。

CocosSharp 到目前为止非常酷,但它的 Visual Studio 模板肯定还有改进的空间。

于 2016-05-27T15:17:23.820 回答