Estoy escribiendo un motor de juegos de código abierto llamado YoghurtGum para plataformas móviles (Windows Mobile, Android). Este fue uno de mis grandes y grandes problemas. Primero lo resolví así:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
¿Viste el void*
? Esto se debe a que RenderMethodDirectDraw
devuelve una superficie DirectDraw mientras RenderMethodDirect3D
devuelve un grupo de vértices. Todo lo demás también estaba dividido. Tuve una Sprite
clase que tenía un SpriteDirectDraw
puntero o un SpriteDirect3D
puntero. Es un poco horrible.
Así que últimamente, he estado reescribiendo muchas cosas. Lo que tengo ahora es a RenderMethodDirectDraw.dll
y a RenderMethodDirect3D.dll
. De hecho, puede intentar usar Direct3D, fallar y usar DirectDraw en su lugar. Eso es porque la API sigue siendo la misma.
Si quieres crear un sprite, no lo haces directamente sino a través de una fábrica. Luego, la fábrica llama a la función correcta en la DLL y la convierte en una matriz.
Entonces, esto está en la RenderMethod
API:
virtual Sprite* CreateSprite(const char* a_Name) = 0;
Y esta es la definición en 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 esto tenga sentido. :)
PD: Me encantaría haber usado STL para esto, pero no hay soporte en Android. :(
Básicamente:
- Mantenga cada render en su propio contexto. Ya sea una DLL, o una biblioteca estática o simplemente un montón de encabezados. Mientras tengas un RenderMethodX, SpriteX y StuffX, estarás dorado.
- Roba todo lo que puedas de la fuente Ogre.
EDITAR: Sí, tiene sentido tener interfaces virtuales como esta. Si su primer intento falla, puede probar con otro método de renderizado. De esta manera, puede mantener agnóstico todo su método de representación de código.