前回問題だったGraphicsSelector
クラスのif文を少し改善した。
入手先
課題
まだGraphicsSelector
クラスは改善の余地がある。
現状、描画アーキテクチャや描画内容が増えるたびに、大量のコードを追加せねばならない。 たとえば、OpenGLを追加した場合、以下のようなファイル修正が必要になる。
- 新規ファイル追加
- OpenGLWndProc.cpp
- OpenGLWndProc.h
- IOpenGLDrawer.cpp
- IOpenGLDrawer.h
- OpenGLDrawerScene1.cpp
- OpenGLDrawerScene1.h
- OpenGLDrawerScene2.cpp
- OpenGLDrawerScene2.h
- 既存ファイル修正
GraphicsSelector.cpp
GraphicsSelector.h
新規ファイルは内容そのものなので追加するのはかまわない。
でも、それらのファイルをGraphicsSelector
クラスで登録したり初期化したりする処理まで追記せねばならない。
たとえば、OpenGLなどを追加した場合、GraphicsSelector
クラスは以下のようなコード修正が必要になる。
GraphicsSelector.h
private:
Selector<IOpenGLDrawer*> m_openglSelector;
GraphicsSelector.cpp
Initialize関数
if (!m_openglSelector.IsContain(_T("Scene1"))) {
m_openglSelector.Add(_T("Scene1"), (IOpenGLDrawer*) new OpenGLDrawerScene1());
}
if (!m_openglSelector.IsContain(_T("Scene2"))) {
m_openglSelector.Add(_T("Scene2"), (IOpenGLDrawer*) new OpenGLDrawerScene2());
}
m_openglSelector.Select(_T("Scene1"));
if (!m_drawWndProcSelector.IsContain(_T("OpenGL"))) {
m_drawWndProcSelector.Add(_T("OpenGL"), (IDrawWndProc*) new OpenGLWndProc(&m_openglSelector));
}
Finalize関数
delete m_drawWndProcSelector.Get(_T("OpenGL"));
delete m_openglSelector.Get(_T("Scene1"));
delete m_openglSelector.Get(_T("Scene2"));
m_openglSelector.Clear();
SelectOpenGLDrawer関数
void GraphicsSelector::SelectOpenGLDrawer(const std::basic_string<TCHAR>& key)
{
if (!m_openglSelector.IsContain(key)) { return; }
if (m_openglSelector.Get(key) == m_openglSelector.GetSelected()) { return; }
m_openglSelector.GetSelected()->Finalize();
m_openglSelector.Select(key);
m_openglSelector.GetSelected()->Initialize();
}
Select関数
} else if (_T("OpenGL") == wndProcKey) {
this->SelectDrawWndProc(wndProcKey);
this->SelectOpenGLDrawer(drawerKey);
}
所感
はっきり言って使えない。 こんなものFrameworkとは言わない。 だからGraphicsSelectorはFramework名前空間には入っていない。
これをもっと改善してFrameworkレベルにしたい。
できることなら、1行も追加することなく、自動で使えるようにしたい。
たとえば今回の例でいえば、OpenGL関係の新規ファイル追加しただけでGraphicsSelector.Select("OpenGL", "Scene1");
を使えるようにしたい。
さて、どうしたものか。