Estou escrevendo um mecanismo de jogo de código aberto chamado YoghurtGum para plataformas móveis (Windows Mobile, Android). Esse foi um dos meus grandes problemas. Primeiro eu resolvi assim:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
Você viu o void*
? Isso RenderMethodDirectDraw
ocorre porque retorna uma superfície DirectDraw e RenderMethodDirect3D
retorna um pool de vértices. Todo o resto foi dividido também. Eu tive uma Sprite
aula que tinha um SpriteDirectDraw
ponteiro ou umSpriteDirect3D
ponteiro. Isso meio que sugou.
Ultimamente, tenho reescrito bastante as coisas. O que eu tenho agora é um RenderMethodDirectDraw.dll
e umRenderMethodDirect3D.dll
. Na verdade, você pode tentar usar o Direct3D, falhar e usar o DirectDraw. Isso ocorre porque a API permanece a mesma.
Se você deseja criar um sprite, não o faz diretamente, mas através de uma fábrica. A fábrica chama a função correta na DLL e a converte em um pai.
Então, isso está na RenderMethod
API:
virtual Sprite* CreateSprite(const char* a_Name) = 0;
E esta é a definição em RenderMethodDirectDraw
:
Sprite* RenderMethodDirectDraw::CreateSprite(const char* a_Name)
{
bool found = false;
uint32 i;
for (i = 0; i < m_SpriteDataFilled; i++)
{
if (!strcmp(m_SpriteData[i].name, a_Name))
{
found = true;
break;
}
}
if (!found)
{
ERROR_EXPLAIN("Could not find sprite named '%s'", a_Name);
return NULL;
}
if (m_SpriteList[m_SpriteTotal]) { delete m_SpriteList[m_SpriteTotal]; }
m_SpriteList[m_SpriteTotal] = new SpriteDirectDraw();
((SpriteDirectDraw*)m_SpriteList[m_SpriteTotal])->SetData(&m_SpriteData[i]);
return (m_SpriteList[m_SpriteTotal++]);
}
Espero que isto faça sentido. :)
PS: Eu adoraria ter usado o STL para isso, mas não há suporte no Android. :(
Basicamente:
- Mantenha todas as renderizações em seu próprio contexto. Uma DLL, uma biblioteca estática ou apenas um monte de cabeçalhos. Contanto que você tenha um RenderMethodX, SpriteX e StuffX, você é de ouro.
- Roube o máximo que puder da fonte Ogre.
EDIT: Sim, faz sentido ter interfaces virtuais como esta. Se sua primeira tentativa falhar, você pode tentar outro método de renderização. Dessa forma, você pode manter todo o seu método de renderização de código independente.