私はAndroid NDKとopengl es 2.0を使ってAndroid用の小さなゲームエンジンを開発しています。最近、プロジェクトは大きくなり、コードをリファクタリングする必要がありました。次の問題のための適切な設計パターンを見つけることができません。いつも静的なメンバのためのC++デザイン
AndroidでOnPause()状態に到達すると、OpenGLコンテキストは破棄されますが、javaおよびC++の変数とオブジェクトの状態は維持されます。プレイヤーが一時停止してアプリケーションを再開するたびに、私はOpenGLの部分、バッファー、シェーダー、頂点などを再初期化する必要があります。
「スクエア」のような「正方形のオブジェクト」を作るクラスがあり、属性、および各「四角いオブジェクト」を描くことができるので、四角形は、適切にレンダリングされたクラスの静的(opengl)メンバにアクセスできます。ですから、オブジェクトを描画する前にこの静的メンバーを初期化しなければなりません。OpenGLコンテキストが作成または再作成されたときにそれを行います。
さらに、各クラスには独自のopengl属性があるため、各クラスは独自のパラメータで個別に初期化されるため、各クラスが初期パラメータを設定できるように設計したり、これらのパラメータを渡したりキャッチしてクラス(私はこれらのパラメータがプライベートであると言うことを忘れていた)。しかし、私が前に言ったように、これらのパラメータは、アプリが再開されるたびに再初期化する必要があります。
現在だから私は、ときにクラスにいくつかの(静的/ harcoded)の変数を設定し、したい、私は個別に
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
のようなものを書きたいですOpenGLコンテキストを作成し、クラスを「魔法」の方法で初期化し、各クラスのinitメソッドへの呼び出しをコーディングする必要はありません。
私は継承を使用しようとしましたが、オブジェクトではなくクラスを初期化する必要があり、静的オブジェクトを実装し、このオブジェクトをcppファイルで初期化し、これがコンストラクタで作成されたときに、オブジェクト自身のクラスにあるベクトルで、ベクター内で生成されますが、この設計は私に多くの問題をもたらしました。
誰も私を助けることができるいくつかのデザインを知っていますか?
EDIT:私のクラスのstucture
shader
とfrag
パラメータはパスのファイルであり、私は彼らにいくつかのタスクを実行するためinit()
機能は本当に大きいですが、その結果を渡すの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:
}
すべてを単一のシングルトンに結合します。 –
@πάνταῥεῖはい、私はそれについて考えていましたが、同じです。各クラスに対して 'init()'を呼び出さなければなりません。どうすれば実装できますか? – quetzalfir
C++には、Java /のような既存のクラスを反復する方法がありません。ネットは持っている - それについて鍛えている場合。したがって、直接、または格納されたポインタによって "init"を呼び出す必要があります。あなたのクラスは "init"関数で共通するものがありますか? – Evgeniy