Ich schreibe eine Open-Source-Spiele-Engine namens YoghurtGum für mobile Plattformen (Windows Mobile, Android). Dies war eines meiner großen Probleme. Zuerst habe ich es so gelöst:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
Hast du das gesehen void*
? Dies liegt daran, dass RenderMethodDirectDraw
eine DirectDraw-Oberfläche und RenderMethodDirect3D
ein Vertex-Pool zurückgegeben werden. Alles andere war ebenfalls gespalten. Ich hatte eine Sprite
Klasse, die entweder einen SpriteDirectDraw
Zeiger oder einen SpriteDirect3D
Zeiger hatte. Es hat irgendwie gelutscht.
In letzter Zeit habe ich viele Dinge umgeschrieben. Was ich jetzt habe, ist ein RenderMethodDirectDraw.dll
und ein RenderMethodDirect3D.dll
. Sie können sogar versuchen, Direct3D zu verwenden, fehlschlagen und stattdessen DirectDraw verwenden. Das liegt daran, dass die API gleich bleibt.
Wenn Sie ein Sprite erstellen möchten, tun Sie dies nicht direkt, sondern über eine Factory. Die Factory ruft dann die richtige Funktion in der DLL auf und konvertiert sie in eine übergeordnete Funktion.
Das ist also in der RenderMethod
API:
virtual Sprite* CreateSprite(const char* a_Name) = 0;
Und das ist die Definition in 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++]);
}
Ich hoffe das macht Sinn. :)
PS Ich hätte gerne STL verwendet, aber es gibt keine Unterstützung für Android. :(
Grundsätzlich:
- Behalten Sie jedes Rendering in einem eigenen Kontext. Entweder eine DLL oder eine statische Bibliothek oder nur eine Reihe von Headern. Solange du ein RenderMethodX, SpriteX und StuffX hast, bist du golden.
- Stehlen Sie so viel wie möglich von der Ogerquelle.
EDIT: Ja, es macht Sinn, virtuelle Schnittstellen wie diese zu haben. Wenn Ihr erster Versuch fehlschlägt, können Sie eine andere Rendermethode ausprobieren. Auf diese Weise können Sie alle Code-Rendering-Methoden unabhängig machen.