2011-07-04 116 views
1

這是我的問題。設計問題幫助

我正在使用名爲Box2D的物理庫。我可以連接一個聽衆,告訴我兩個燈具相撞的時間。

本質上,Box2D的工作方式是通過創建b2Body。因此,我只知道碰撞的夾具屬於哪個b2Body。在我的遊戲中,我有一個實體,從中我有一個PhisicsEntity。 PhysicsEntity擁有一個指向b2Body的指針。它也有一個來自實體的sendMessage方法。問題是,從b2Body中,我如何向PhysicsEntity發送碰撞消息。我想要做的是將b2Body的userData void *設置爲其對應的PhysicsEntity。不得不拋出void *來做這件事似乎是非常錯誤的。

有沒有更好的方法可以很快地知道與b2Body相關聯的物理實體而無需投射或查找?

謝謝

回答

0

這正是像userData字段這樣的字段用於引用應用程序的與庫對象相關的數據的目的。這是一個完全合適的使用void *

如果你問的是C,我會說你不應該使用任何強制轉換,因爲轉換到和從void *可以完成沒有任何強制轉換和需要使用強制轉換是一個可能的問題的標誌,但如果我記得正確C++需要這些轉換(我不使用C++足夠確定)。

+0

C++需要和void *相關。部分原因是它可以幫助人們將void *用作「指向某物的指針」,或者將其從一種類型轉換爲另一種類型的廉價類型,這會在多重繼承的情況下引發破壞。 – dascandy

0

這實際上正是userData指針的意思。這是一個相當標準的範例 - 查看函數,例如pthread_create或CreateThread作爲另一個示例。

如果遇到不允許使用void *的庫(或不安全 - 如將其作爲int存儲在本地),則可以使用std :: map來解析類型。這比較慢,而且還有更多的開銷。

+0

由於類是多態的,我必須動態轉換嗎? – jmasterx

+0

不,您可以使用static_cast或c樣式的案例(更喜歡前者)。你只是在同一個指針類型中進行轉換,因此無論哪種方式都可以。 Reinterpret_cast甚至可以工作 - 但這並不是必要的,並且會顯示一些醜陋的東西,但這不是(至少沒有那麼多)。 – dascandy