我正在使用DirectX9并构建一个Basic OOP系统来处理绘制/更新循环。
所以我有3个课程DirectXGame
,D3DWindow
,DemoGame : public DirectXGame
,因此您可以看到DemoGame
扩展了DirectXGame
课程。并且演示游戏中有一个D3DWindow
的实例作为窗口。
所以D3DWindow创建一个Windows窗口,然后在窗口内启动DirectX或对其进行全面筛选。
所以我创建了void(*drawEvent)(int dt)
& void(*updateEvent)(int dt)
和一些setter(addDraw, addUpdate
)应允许DirectXGame
将方法传递到D3DWindow
对象
void DirectXGame::createWindow(D3DWindow* wind, HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShowD)
{
this->d3dWindow = wind;
this->d3dWindow->create(hInstance, hPrevInstance, lpCmdLine, nCmdShowD);
/*below is lines 26 and 27 from errors*/
this->d3dWindow->addDraw(this->draw);
this->d3dWindow->addUpdate(this->update);
}
然而我得到的只是错误
C3867: 'DirectXGame::draw': function call missing argument list; use '&DirectXGame::draw' to create a pointer to member directxgame.cpp 26
C3867: 'DirectXGame::update': function call missing argument list; use '&DirectXGame::update' to create a pointer to member directxgame.cpp 27
我无法通过& DirectXGame :: update或DemoGame :: update,因为这些无法访问成员变量,所以我怎样才能让它工作。
现在我一直在阅读并找到像转发器这样的东西,但为了做到这一点,我必须在DirectXGame
内转换为D3DWindow
,这会导致需要一个标头,然后包含循环问题。
如果您需要查看更多代码,请提出要求。
答案 0 :(得分:1)
您可以使用具有2种纯抽象方法的界面' draw'并且'更新'。 D3DWindow拥有一个指向此接口实例的指针(您的DirectXGame实例)并调用' draw'并且'更新'在它上面。
class IDirectXGame
{
public:
virtual ~IDirectXGame() {}
virtual draw(int) = 0;
virtual update(int) = 0;
};
继承接口
class DirectXGame : public IDirectXGame
{
...
};
D3DWindow拥有一个指向实现该接口的实例的指针。
class D3DWindow
{
...
IDirectXGame *gameInstance;
};
在' createWindow'只是通过这个'到了windows' gameInstance'构件。