我正在开发Android的小游戏引擎与Android NDK和opengl ES 2.0,最近该项目变得越来越大,我需要重构一些代码,我不能'为下一个问题寻找合适的设计模式。初始静态成员的C++设计,任何时候需要
在android上,当应用程序到达OnPause()状态时,opengl上下文被销毁,但是java和C++中变量和对象的状态被保留。所以每次玩家暂停和恢复应用程序,我必须重新初始化opengl部分,缓冲区,着色器,顶点等。
我有类似“方形”的“方形对象”,每个都有自己的类属性,并且可以绘制每个“方形对象”,所以方块可以访问该类的静态(opengl)成员,这些成员用于正确渲染。所以这个静态成员必须在绘制对象之前初始化,我在创建或重新创建opengl上下文时执行它。每个类都有自己的opengl属性,所以每个类都有自己的参数单独初始化,所以我想要一个设计,每个类可以设置一些初始参数,传递或捕获这些参数来初始化静态成员班(我忘了说这些参数是私人的)。但正如我之前所说,每次应用程序恢复时都需要重新初始化这些参数。
目前我初始化这些成员分别喜欢
Square::init(/*hardcoded parameters*/);
Circle::init(/*hardcoded parameters*/);
Triangle::init(/*hardcoded parameters*/);
Polygon::init(/*hardcoded parameters*/);
Shape::init(/*hardcoded parameters*/);
.
.
.
.
// Many other inits.....
.
,我想写类似
// here all the classes with opengl part are initialized
// all init methods of each class are called here, with their respective parameters
Opengl_Initializer::init(); // <--- magic way, no other init calls
所以我想一些(静态/ harcoded)变量设置为分类,然后当将创建opengl上下文,该类将以“魔术”方式进行初始化,而不需要为每个类的init方法编写调用代码。
我试过使用继承,但问题是我需要初始化类而不是对象,也试图实现静态对象并在cpp文件中初始化此对象,并存储指向对象的指针在一个矢量中,当它是在他的构造器中创建的时候,是一个在该对象自己的类中的向量,但是这种设计给了我很多问题。
有谁知道一些可以帮助我的设计?
编辑:我的课
的init()
功能的stucture是非常大的,因为shader
和frag
参数路径文件,我对他们执行一些任务,合格的结果进行,以OpenGL和返回我一个ID
这是该程序静态变量,用OpenGL部分的所有clases实现这个同样的过程,参数camera
是把它连接到相机
class Square {
// static variable all classes have
static GLuint program;
// other glparameters not in common, initialized in the same static init() method
static GLint uniform1;
static GLint uniform2;
public;
// the static init function has the same header on all the classes
static init(const char* shader, const char* frag, const char *camera);
}
也许有些结构我想是
class Square {
static GLuint program;
static const char *vertex = "hardcode";
static const char *frag = "hardcode";
static const char *cam = "harcode";
static init();
/// or somethig like
static Initializer init(
"harcode shader", "hardcode frag", "hardcode camera",
[&] (void) ->void {
//this is the init function
}
);
public:
}
将所有内容加入到一个Singleton中。 –
@πάνταῥεῖ是的,我曾经想过,但也是一样的,我必须为每个类调用'init()',你会如何实现它? – quetzalfir
C++没有办法迭代现有的类,如Java /。网有 - 如果你对此有所了解。所以你需要直接调用“init”或存储指针。你的类在“init”函数中有什么共同点? – Evgeniy