C++ 如何基于b2Joint实例化提取/创建JointDef
我正在尝试序列化b2World,由于Box2D有许多内部使用、生成和删除的私有对象,因此问题变得更加复杂。我决定使用这些内部对象get()函数来获取所需的数据,并在节省时间的基础上创建一个“b2Definition”对象,然后使用全局工厂的“create”方法来重新创建对象 但是,我遇到了一些需要帮助的问题:下面的代码中包含了我需要的所有JointDef数据,但无法确定如何从指针获取正确类型的对象。 我还想知道我是否应该尝试保存联系人数据。。。。它是在工厂自动制造的吗C++ 如何基于b2Joint实例化提取/创建JointDef,c++,serialization,box2d,C++,Serialization,Box2d,我正在尝试序列化b2World,由于Box2D有许多内部使用、生成和删除的私有对象,因此问题变得更加复杂。我决定使用这些内部对象get()函数来获取所需的数据,并在节省时间的基础上创建一个“b2Definition”对象,然后使用全局工厂的“create”方法来重新创建对象 但是,我遇到了一些需要帮助的问题:下面的代码中包含了我需要的所有JointDef数据,但无法确定如何从指针获取正确类型的对象。 我还想知道我是否应该尝试保存联系人数据。。。。它是在工厂自动制造的吗 b2Wel
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= ????
我需要上面的数据吗?有办法得到它吗?我最近做了很多这方面的工作,制作了一个导出/导入实用程序,将Box2D世界序列化为JSON,然后再次加载。您可能会发现源代码很有用-查看底部的滚动条,您可以看到源代码,查看函数b2dJson::b2j(b2Joint*joint) 这并不复杂,您只需检查关节类型并将其转换为该类型的指针即可访问内容:
switch ( joint->GetType() )
{
case e_revoluteJoint:
{
b2RevoluteJoint* revoluteJoint = (b2RevoluteJoint*)joint;
...
}
}
但有几件事需要注意:
- 您需要更改Box2D代码本身,向关节添加一些额外的GetXXX()函数,以获取所有必要的信息。我在那页上也放了一个列表,这样你就可以查看我的案例(我使用的是最新的svn)
- 关节持有一个指向它们所连接的实体的内存指针,这对序列化是无用的,因此您首先需要序列化世界中的实体,然后在该列表中为关节提供一个索引
- 关节定义采用参考角度,但关节在创建后不会保持该角度,因此需要使用躯干角度和关节角度来计算该角度
- 齿轮接头连接其他两个接头,这些接头作为内存指针保存,因此要重新创建这些接头,您需要首先序列化所有非齿轮接头,然后在该列表中为齿轮接头提供索引
- 最近更改了齿轮运动类型,因此它们不再保留指向它们控制的其他两个运动类型的指针,因此如果要使用最新的svn支持齿轮运动类型,则需要重新添加它们