Tôi đang viết một công cụ trò chơi mã nguồn mở có tên YoghurtGum cho các nền tảng di động (Windows Mobile, Android). Đây là một trong những vấn đề lớn của tôi. Đầu tiên tôi giải nó như thế này:
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
Bạn đã phát hiện ra void*
? Đó là bởi vì RenderMethodDirectDraw
trả về một bề mặt DirectDraw trong khi RenderMethodDirect3D
trả về một đỉnh đỉnh. Mọi thứ khác cũng được chia ra. Tôi có một Sprite
lớp có SpriteDirectDraw
con trỏ hoặc SpriteDirect3D
con trỏ. Nó loại mút.
Gần đây, tôi đã viết lại nhiều thứ. Những gì tôi có bây giờ là một RenderMethodDirectDraw.dll
và a RenderMethodDirect3D.dll
. Thực tế, bạn có thể thử sử dụng Direct3D, thất bại và sử dụng DirectDraw thay thế. Đó là bởi vì API vẫn giữ nguyên.
Nếu bạn muốn tạo một sprite, bạn không thực hiện trực tiếp mà thông qua một nhà máy. Sau đó, nhà máy gọi hàm chính xác trong DLL và chuyển đổi nó thành cha mẹ.
Vì vậy, đây là trong RenderMethod
API:
virtual Sprite* CreateSprite(const char* a_Name) = 0;
Và đây là định nghĩa trong 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++]);
}
Tôi hy vọng điều này có ý nghĩa. :)
Tái bút: Tôi rất thích sử dụng STL cho việc này, nhưng không có hỗ trợ nào trên Android. :
Về cơ bản:
- Giữ mỗi kết xuất trong bối cảnh riêng của nó. Hoặc là một DLL, hoặc một thư viện tĩnh hoặc chỉ là một loạt các tiêu đề. Miễn là bạn có vàng RenderMethodX, SpriteX và StuffX.
- Ăn cắp càng nhiều càng tốt từ nguồn Ogre.
EDIT: Vâng, thật có ý nghĩa khi có các giao diện ảo như thế này. Nếu lần thử đầu tiên của bạn thất bại, bạn có thể thử một phương thức kết xuất khác. Bằng cách này, bạn có thể giữ tất cả mã của mình làm cho phương thức bất khả tri.