モバイルプラットフォーム(Windows Mobile、Android)用のYoghurtGumと呼ばれるオープンソースゲームエンジンを書いています。これは私の大きな問題の1つでした。まず、このように解決しました:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
あなたは見つけましたvoid*
か?これは、頂点プールRenderMethodDirectDraw
をRenderMethodDirect3D
返す一方でDirectDrawサーフェスを返すためです。他のすべても同様に分割されました。ポインターまたはポインターのSprite
いずれかを持つクラスがありました。それはちょっと吸い込まれた。SpriteDirectDraw
SpriteDirect3D
だから最近、私は物事をたくさん書き直しています。私が今持っているのは、RenderMethodDirectDraw.dll
とRenderMethodDirect3D.dll
です。実際、Direct3Dの使用を試みて失敗し、代わりにDirectDrawを使用することができます。これは、APIが同じままであるためです。
スプライトを作成する場合は、直接ではなく、ファクトリを使用して作成します。その後、ファクトリはDLL内の正しい関数を呼び出し、それを親に変換します。
したがって、これはRenderMethod
API にあります。
virtual Sprite* CreateSprite(const char* a_Name) = 0;
そして、これはの定義です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++]);
}
これが理にかなっていることを願っています。:)
PSこれにはSTLを使用したかったのですが、Androidにはサポートがありません。:(
基本的に:
- すべてのレンダリングを独自のコンテキストで保持します。DLL、静的ライブラリ、または単なるヘッダーの束。RenderMethodX、SpriteX、およびStuffXがあれば、最高です。
- Ogreソースからできるだけ多くを盗みます。
編集:はい、このような仮想インターフェースを持つことは理にかなっています。最初の試行が失敗した場合、別のレンダリング方法を試すことができます。このようにして、すべてのコードレンダリングメソッドに依存しないようにすることができます。