Box2d - 变长数组的非POD元素类型 'b2Vec2'

7

我正在开发一个游戏导入程序,它可以读取XML文件并为每个物体创建box2d刚体。

例如:

  <polygon vertexCount="3" density="0" friction="0.25" restitution="0.30000000000000004">
      <vertice x="6.506500000000001" y="0.4345"/>
      <vertice x="6.534970527648927" y="0.48385302734375"/>
      <vertice x="6.478029472351075" y="0.48385302734375"/>
  </polygon>

问题在于我现在遇到了多边形部分的导出器,我需要在添加顶点并设置它们的位置之前设置一个b2vec2数组。
int count = [[childnode attributeForName:@"vertexCount"] intValue];
b2Vec2 points[count];

但是 Box2d 希望 points[5] 是一个实际的字面数字(例如 points[5]),而不是一个变量 points[number]。当我使用变量 count 时,它输出的错误是:

 Variable length array of non-POD element type 'b2Vec2'

我该如何解决这个问题?我尝试将它设为常量,但这也不起作用(而且对我没有帮助,因为我需要它是动态的)。

2个回答

19

你需要在堆上创建数组:

b2Vec2 *array = new b2Vec2[count];

完成后不要忘记手动删除数组。

更好的选择是使用 std::vector:

a)
std::vector<b2Vec2> vertices(count);
vertices[0].set(2, 3);
vertices[1].set(3, 4);
...

b)
std::vector<b2Vec2> vertices;
vertices.push_back(b2Vec2(2, 3));
vertices.push_back(b2Vec2(3, 4));

似乎无法正常工作,在b2PolygonShape.cpp中崩溃。我最终所做的是手动设置.m_vertexCount,然后使用.m_verticles[i].Set(x,y)进行设置。 - M0rph3v5
准确来说,它在以下位置失败了:b2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon); - M0rph3v5
检查您是否将多边形的两个顶点放在完全相同的位置。 - iforce2d
它与手动设置的.m_vertexCount和.m_vertices[i].Set使用相同的点正常工作,因此我怀疑这方面没有任何问题。 - M0rph3v5

-3
采取了更容易的方式,访问了不应该访问的变量:
polygonShape.m_vertexCount = count;

然后在for循环中设置它们:

polygonShape.m_vertices[c].Set(x,y);

它完美地工作了 :)


之后我使用了 .Set(m_vertices, m_vertexCount) 方法,否则物理引擎本身会出现问题。 - M0rph3v5
你不太确定你是如何替换现有的错误的。你能提供更多的前后代码吗? - fulvio

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