ฉันกำลังเขียนเอ็นจิ้นเกมโอเพนซอร์ซชื่อ YoghurtGum สำหรับแพลตฟอร์มมือถือ (Windows Mobile, Android) นี่เป็นหนึ่งในปัญหาใหญ่ของฉัน แรกฉันแก้ไขมันเช่นนี้
class RenderMethod
{
public:
virtual bool Init();
virtual bool Tick();
virtual bool Render();
virtual void* GetSomeData();
}
คุณไม่ได้จุดvoid*
? นั่นเป็นเพราะRenderMethodDirectDraw
ส่งกลับพื้นผิว DirectDraw ในขณะที่RenderMethodDirect3D
ส่งกลับจุดยอด ทุกอย่างอื่นก็ถูกแยกออกเช่นกัน ฉันมี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 คุณก็จะได้ทอง
- ขโมยมากที่สุดเท่าที่จะทำได้จากแหล่งอสูร
แก้ไข: ใช่มันเหมาะสมที่จะมีอินเทอร์เฟซเสมือนเช่นนี้ หากความพยายามครั้งแรกของคุณล้มเหลวคุณสามารถลองวิธีการแสดงผลอื่นได้ วิธีนี้คุณสามารถเก็บวิธีการแสดงผลโค้ดของคุณทั้งหมดไม่เชื่อเรื่องพระเจ้า