2011-06-18 48 views
3

說一個遊戲,我們有實體互相溝通。說一個玩家碰到一個物品,現在該物品應該放在他的std::vector<Item*>在這裏適合動態演員嗎?

當玩家收到碰撞消息時,他將物品作爲實體*接收。玩家是否適合作爲物品投射,如果投射成功,將物品推入盤點?

即使遊戲給他發了HIT_ITEM消息,他仍然需要投它推入。

感謝

回答

2

dynamic_cast可幫助您檢查執行向下轉換時的有效性。

如果指針或引用無法安全地下載,它將返回NULL或引發異常(引用爲std::bad_cast)。

除非您向我們展示班級結構,否則不清楚。

2

如果你能圓滿回答這些問題自己,然後是。

  • 爲什麼玩家會收到帶有實體*而不是物品*的碰撞消息?
  • 在潛在的角色點,你是否確定它是動態類型的項目?如果不是?
  • 有沒有什麼辦法可以相對輕鬆地重新設計你的代碼來避免劇組?

無論如何,不​​要教條。如果在當前的情況下,沮喪比其他事情更方便,那就去做吧。恕我直言

+0

你能舉一個重新設計的例子嗎?我的消息類有一個實體*,這就是爲什麼一切都以這種方式發送。我的Message類應該包含一個指向我遊戲中每個實體類型的指針嗎? – jmasterx

+0

@Milo:不應該。我不知道你的內部。有數百種模式可以達到這些目的 - 每種模式都適用於它自己的情況......但是,就我的經驗而言,就通用消息而言,通常會向下傾斜 –

+1

@Milo:一個例子是與訪問者進行雙重調度用於將物品添加到玩家庫存。搜索「雙重調度」,它應該給你足夠的例子。 – Xeo

-1

如何將一個類型成員和GetType()函數一起添加到基類中?這就是我通常解決這些「鑄造」問題的方法。

另外,如果您打算使用dynamic_cast,請不要忘記打開RTTI(請忽略它,這很明顯)。

+0

即使我知道這個類型,我也不能只將一個Entity *推到一個Item的vector中嗎?我可以嗎? – jmasterx

+0

@Milo:'Entity'和'Item'之間的關係是什麼? – quamrana

+0

即使你知道'Entity'消息是一個使用'GetType'函數的'Item',你仍然需要投它 - 但是,你可以'static_cast'它會更快一點。 – Node

0

你應該問自己的主要問題是 - 我可以讓這個實體上的虛函數嗎?在這種情況下,我可能會說「不」,因爲對於非項目知道或關心你將如何處理項目,這是沒有意義的。因此dynamic_cast可能是正確的解決方案 - 您可以安全地處理返回的null的情況,並使其他派生類不必知道有關Item的任何內容。