모바일 플랫폼 (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
그래서 최근에 많은 것을 다시 쓰고 있습니다. 내가 지금 가지고있는 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++]);
}
이것이 의미가 있기를 바랍니다. :)
추신 : 나는 이것을 위해 STL을 사용하고 싶었지만 Android에서는 지원하지 않습니다. :(
원래:
- 모든 렌더링을 자체 컨텍스트로 유지하십시오. DLL 또는 정적 라이브러리 또는 여러 헤더입니다. RenderMethodX, SpriteX 및 StuffX가 있으면 황금색입니다.
- 오우거 소스에서 최대한 많이 훔치십시오.
편집 : 예. 이와 같은 가상 인터페이스를 갖는 것이 합리적입니다. 첫 번째 시도가 실패하면 다른 렌더링 방법을 시도 할 수 있습니다. 이런 식으로 모든 코드 렌더 메소드를 무시할 수 있습니다.