我正在为移动平台(Windows Mobile,Android)编写一个名为YoghurtGum的开源游戏引擎。这是我的大问题之一。首先,我像这样解决它:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
你发现了void*
吗?那是因为RenderMethodDirectDraw
返回DirectDraw曲面而RenderMethodDirect3D
返回顶点池。其他所有内容也被拆分。我有一个Sprite
具有SpriteDirectDraw
指针或SpriteDirect3D
指针的类。有点烂
所以最近,我一直在重写很多东西。我现在所拥有的是a RenderMethodDirectDraw.dll
和a 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来源中尽可能多地窃取信息。
编辑:是的,拥有这样的虚拟接口确实有意义。如果第一次尝试失败,则可以尝试其他渲染方法。这样,您可以使所有代码呈现方法均不可知。