2011-08-05 27 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