2010-03-18 48 views
0

這是用DirectX做的一個COM問題。通用調用OnResetDevice()和OnLostDevice()

因此,ID3DXSprite和ID3DXFont以及一堆其他ID3DX *對象都要求您在d3d設備丟失時調用OnLostDevice(),並在設備重置時調用OnResetDevice()。

我想要做的是維護所有ID3DX *對象的數組,每當設備丟失或重置時,只需在每個對象上調用OnResetDevice()和OnLostDevice()。

但是我似乎無法爲ID3DX *類找到BASE CLASS ...它們似乎都是從IUnknown繼承的。

有沒有辦法做到這一點,或者我必須維護單獨的ID3DXFont *指針,ID3DXSprite *指針等數組?

回答

1

沒有一個共同的基類,對不起。

可能使用多重繼承和模板來存檔你想要的。事情是這樣的(未經測試,但希望你能明白我的意思)......

#include <d3dx9.h> 
#include <vector> 

using namespace std; 

class DeviceLostInterface 
{ 
public: 
    virtual void onLost() = 0; 
    virtual void onReset() = 0; 
}; 

template <typename Base> 
class D3DXWrapper : public Base, public DeviceLostInterface 
{ 
public: 
    virtual void onLost() { Base::OnLostDevice(); } 
    virtual void onReset() { Base::OnResetDevice(); } 
}; 


int main() 
{ 
    // Wouldn't be set to null in real program 
    D3DXWrapper<ID3DXSprite>* sprite = 0; 
    D3DXWrapper<ID3DXFont>* font = 0; 

    vector<DeviceLostInterface*> things; 
    things.push_back(sprite); 
    things.push_back(font); 

    // This would be a loop... 
    things[0]->onLost(); 
    things[1]->onLost(); 

} 

這類符合您的要求的,但說實話,我真的不認爲這是非常有用的。你可能需要某種方法來知道將每個項目轉回的內容,或者將指針保留在類型特定的列表中,然後您可以編寫單獨的代碼來重置每種類型。