我想编写一个在OpenGL和DirectX中工作的游戏。我知道我必须使用OpenGL API和DirectX API分别编写一次函数。但在游戏开始之前,我如何选择图形API呢?
在我的程序中,我有一个超类,它具有必须由子类实现的纯虚函数。子类是使用特定的renderAPI来执行函数的类。
下面是一个小例子来说明这一点:
# include <iostream>
class Renderer{
public:
enum API{
None=0,
OpenGL = 1,
DirectX = 2
};
virtual void bindBuffer() = 0;
};
class OpenGLBuffer: public Renderer{
public:
virtual void bindBuffer(){
//opengl Code
}
};
static Renderer::API api = Renderer::API::OpenGL;
using namespace std;
int main()
{
switch(api){
case Renderer::API::None:
cout<<"Nothing" << std::endl;
break;
case Renderer::API::OpenGL:
cout<<"OpenGL code" << std::endl;
break;
case Renderer::API::DirectX:
cout<<"DirectX code" << std::endl;
break;
}
return 0;
}
如何在游戏开始前更改静态变量API?我有个主意,但我不确定这是不是正确的方法。例如,使用int main(int argc, char *argv[])
并在命令行中提供图形API。但如何让它成为现实中的大公司。
2条答案
按热度按时间xj3cbfub1#
您可以使用抽象接口和继承。
创建一个包含要使用的API的抽象类(结构):
使用工厂设计模式,使用您选择的框架创建实现API的子类:
现在,您可以这样做:
事实上,大公司只使用一种框架,并根据自己的需求进行定制。勇敢的公司制定了自己的框架。
au9on6nz2#
大公司会有一个配置文件,在Main函数的开始,您将读取该文件并捕获您应该使用的API的值。然后在您的游戏中,您将有一个窗口/面板/屏幕,您可以在其中选择值,更改这些值后,新的值将保存到该配置文件中。下次您的软件启动时,它将读取该文件,其中将有一个新值,指定一个新的API。
关于代码,实际上应该是这样的:
然后,在您的main函数中,您将拥有如下内容: