2011-08-05 28 views
0

我试图序列化b2World,并且由于Box2D的公司所使用,制作,并在内部删除许多私人物品,这个问题变得更加复杂。我决定,我应该使用这些内部对象得到()函数来得到我需要的数据,并创建它在节省时间基于掀起了“b2Definition”对象,并使用定义与全球工厂“创造”的方法来重新创建对象。如何提取/创建基于JointDef掀起了b2Joint实例

我遇到了一些问题,但我需要帮助:以下代码是我需要的所有JointDef数据,但无法弄清楚如何从指针获取正确类型的对象。

我也想知道如果我甚至应该尝试保存联系人数据....难道是在工厂自动进行创建metods?

 b2WeldJointDef JointDef; //QUESTION: how do i get this 
     //JointDef.referenceAngle=  Joint-> ?????  

     b2GearJointDef JointDef; //QUESTION: how do i get these 
     //JointDef.joint1=    Joint-> ?????? 
     //JointDef.joint2=    Joint-> ?????? 

     b2LineJointDef JointDef; //QUESTION: how do i get these?? 
     //JointDef.localAxisA=   Joint-> ???? 
     //JointDef.lowerTranslation= Joint-> ????  
     //JointDef.upperTranslation= Joint-> ???? 

     b2MouseJointDef JointDef; //No problems 

     b2PrismaticJointDef JointDef; //QUESTION: how do i get these?? 
     //JointDef.referenceAngle=  Joint-> ???? 
     //JointDef.localAxis1=   Joint-> ???? 
     //JointDef.lowerTranslation= Joint-> ????     //JointDef.upperTranslation= Joint-> ???? 
     //JointDef.maxMotorForce=  Joint-> ???? 

     b2PulleyJointDef JointDef; //QUESTION: how do i get these? 
     //JointDef.maxLengthA=   Joint-> ???? 
     //JointDef.maxLengthB=   Joint-> ????  

     b2RevoluteJointDef JointDef; //QUESTION: how do i get these? 
     //JointDef.maxMotorTorque=  Joint-> ???? 
     //JointDef.referenceAngle  Joint-> ???? 
     //JointDef.lowerAngle=   Joint-> ????  
     //JointDef.upperAngle=   Joint-> ???? 

     b2JointDef JointDef; 
     //JointDef.collideConnected= ???? 

我需要上面的数据吗?有没有办法得到它?

回答

1

我做了很多这方面最近作出的导出/导入实用程序序列化的Box2D世界JSON,然后重新装入。你可能会发现源代码有用 - 检查出http://www.iforce2d.net/b2djson滚动到底部,你可以看到源代码,看看函数b2dJson :: b2j(b2Joint * joint)

这并不复杂,你只需要检查关节型和转换为该类型的指针来访问内容:

switch (joint->GetType()) 
{ 
    case e_revoluteJoint: 
    { 
     b2RevoluteJoint* revoluteJoint = (b2RevoluteJoint*)joint; 
     ... 
    } 
} 

有几件事情,虽然要注意:

  • 你需要改变的Box2D代码本身添加一些额外的getXXX( )功能的关节获得所有必要的信息。我把它们列在那个页面上,所以你可以检查这些是为我的情况(我使用最新的svn)
  • 关节持有一个内存指针,他们加入的是无用的序列化,所以你将首先需要序列化世界中的物体,然后给该关节索引在该列表中
  • 联合defs采取参考角度,但关节不会在创建它们后保留,因此您需要使用身体角度和关节角度计算出它是什么
  • 齿轮接头加入其他两个关节和它们持有的内存指针,所以要重新创建这些,你需要先序列化所有非齿轮关节,然后给齿轮关节在该列表中的索引
  • 最近10个齿轮关节被改变了,以至于他们不再保持指向它们控制的另外两个关节的指针,所以如果你想用最近的svn支持齿轮关节,你需要将它们加回去。
+0

没有办法避免更改源代码?并在看点2,不提升:: serialize基本上这样做了吗?我记得文档说了一些关于保存ptr指向(身体)的东西,在我的情况下,它是在ptr之前序列化的。我还需要这样做吗?这个技巧是否适用于box2D中的所有指针?如b2ContactEdge和b2JointEdge? – Griffin

+0

没错。 Box2D并没有真正考虑到这种功能,但幸运的是没有太多必要的改变。我不知道任何关于提升的信息(恐怕现在只是简单地看一下) - 即使'深度指针保存'出现了,我怀疑它会给你一个有效的Box2D世界,它会引发关于什么处理用户数据,以及Box2D的新版本可以如何支持。除非我误解了,否则需要向无论如何要序列化的所有内容添加一个函数void serialize(Archive&ar,const unsigned int version),这需要改变Box2D的更改方式。 – iforce2d

+0

哦对不起...还有一个非侵入性的版本,它似乎照顾重复的指针。我敢肯定,如果不使用适当的CreateBody方法,你不会得到工作世界,这意味着在反序列化之后,你仍然需要以某种方式获取第一篇文章中的数据。我不确定你为什么要保存联系人数据......当你添加一个身体到世界上时,这个信息会自动更新。基本上你想用你最初创建它的方式重新创建世界,就是使用CreateBody,CreateFixture等。其他内部像b2ContactEdge可以省略。 – iforce2d