box2d 記憶體管理: b2shape 的管理
寫box2d 的**,往往都見過這樣的一段:
b2edgeshape groundedge;
b2fixturedef boxshapedef;
boxshapedef.shape=&groundedge;
這個**往往寫在 init() 之類的函式裡,建立四條邊,用來框定螢幕區域。
剛見到這段**的時候我很疑惑的一點是, groundedge 作為建立在棧記憶體上的變數,在超出函式體——例如剛剛提到的init() 時候就被析構銷毀了。可是,我們卻把他的位址賦給了 boxshapedef.shape 域:
boxshapedef.shape=&groundedge;
那麼真正執行起來的時候, 迴圈主體肯定是在 init() 之外的,程式為什麼沒有因為 shape域指標指向無效位址而 crash呢?
實際情況是這樣的:
box2d 自己管理 b2shape 的拷貝。一般接著上面的**會有這樣的**:
groundbody->createfixture(&boxshapedef);
關鍵就在這裡,createfixture 做了什麼?他怎麼使用的 boxshapedef 呢?
除錯跟進發現,在 b2body.cpp 163行:
fixture->create(allocator, this, def);
引數裡有個「def」實參,就是 上面傳進來的 &boxshapedef。繼續跟入,在 b2fixture.cpp 的
void b2fixture::create(b2blockallocator* allocator, b2body* body, const b2fixturedef* def)
函式內,有一句:
m_shape = def->shape->clone(allocator);
box2d 最終根本沒有用一開始我們建立的棧上的區域性變數! 他製作了shape的乙份拷貝,賦值給 m_shape 成員變數,之後即便 我們的groundedge 被銷毀了,box2d 仍然持有有效的資料,而不是無效指標。。。
疑惑解除了~ }
box2d 碰撞過濾
原帖 碰撞篩選就是乙個防止某些形狀發生碰撞的系統。按照具體需求設定哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。box2d通過種群跟組索引支援碰撞篩選。組索引比較簡單,設定其shapedef的groupindex值即可,例如boxdef.filter.groupindex 1。通過groupin...
Box2D學習筆記
box2d是乙個用於遊戲的2d剛體 庫,程式設計師可以在他們的遊戲裡使用他們,也可以是的自己的物體運動的更可信。讓他看起來更加接近現實。物理引擎是乙個程式性的動畫系統。而不是由動畫師去移動物體。這一切都是建立在牛頓力學的基礎之上。box2d最初是用c 來寫的,之後有被多種語言所實現。box2d中的核...
BOX2d繪製曲線
來自天地會的 wkyjoey同學 問道如何做乙個重力大師遊戲 如下圖 這裡要特意表示一下歉意,最近一直忙於工作,沒有及時更新教程。對於重力大師遊戲 試玩之後,不難發現,我們在執行時可以建立的剛體有兩種,線條剛體和多邊形剛體。今天我們來一起研究一下線條剛體的建立。多邊形剛體會在下次教程中討論。這裡我們...