这是一个与 DirectX 有关的 COM 问题。
因此,ID3DXSprite 和 ID3DXFont 以及许多其他 ID3DX* 对象都要求您在 d3d 设备丢失时调用 OnLostDevice() 并在设备重置时调用 OnResetDevice()。
我想做的是维护一个包含所有 ID3DX* 对象的数组,并在设备丢失或重置时对每个对象简单地调用 OnResetDevice() 和 OnLostDevice()。
但是我似乎找不到 ID3DX* 类的基类...它们似乎都以 COM 方式继承自 IUnknown。
有没有办法做到这一点,或者我是否必须维护单独的 ID3DXFont* 指针、ID3DXSprite* 指针等数组?
最佳答案
抱歉,没有通用的基类。
您可以使用多重继承和模板来实现您想要的。像这样的东西(未经测试但希望你能明白)......
#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();
}
这有点符合你的要求,但老实说,我真的不认为它很有用。您要么需要一些方法来知道将每个项目转换回什么,要么将指针保留在特定于类型的列表中,然后您还不如编写单独的代码来重置每种类型。
关于c++ - 对 OnResetDevice() 和 OnLostDevice() 的一般调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2471339/