Create the static library projectFirst, create a "static library" project. We'll call ours GameFramework. (Note that for clarity purposes, we'll only talk about the classes relevant to this article. For following along, feel free to download the accompanying source code). Let's first sketch out our interface class: //rendererInterface.h //This class is to provide us with an interface object to our graphics hardware, //to free us from having specific graphic API calls inside our static library. class rendererInterface { protected: //some base level objects can go here public: rendererInterface(){}; virtual ~rendererInterface(){}; //method to create and initialize our hardware virtual HRESULT createDevice(HWND, DWORD, DWORD, DWORD, BOOL) = 0; //method to destroy it virtual void destroyDevice() = 0; //method to begin rendering primitives virtual HRESULT beginRenderingScene() = 0; //method to end rendering primitives virtual void endRenderingScene() = 0; //method to change the screen clearing color virtual void setClearColor(FLOAT, FLOAT, FLOAT, FLOAT) = 0; }; //In order to properly follow a kind of OO design, let's create ourselves //a "factory" object, which is SOLELY responsible for the creation and //destruction of our rendererInterface object. Note that we made the member //functions of the rendererInterface object pure virtual, in order to prevent //the programmer from instantiating this class DIRECTLY. class rendererFactory { protected: rendererInterface *m_pRenderer; HINSTANCE m_hInst; HMODULE m_hDLL; public: rendererFactory(HINSTANCE hInst){ m_hInst = hInst;}; ~rendererFactory(){ destroyInterface();}; HRESULT initInterface(TCHAR *szType); rendererInterface* getInterface(){ return m_pRenderer; }; void destroyInterface(); }; Okay we'll have to do some explainin'...first off, we're just creating a rendererInterface object which is responsible for interfacing with our graphics API. We're setting up an environment within our framework, so that we can abstract our graphics API calls. The rendererFactory object's responsibility is to properly create and destroy our rendererInterface object. What are DLL's??Again, if you're unsure of what DLL's are, then please consider re-reading GameDev.net's other DLL article. Back already? Okay then let's keep going. Within our GameFramework workspace, create a win32 DLL project with NO files, as we'll add them ourselves. For this sample, we'll call it GameD3DRenderer. Again, follow along with the source code, but for the article's sake, we'll just jot down the more pertinent information: ;GameD3DRenderer.def ;The following functions are exported from this DLL, in order to ;properly create and destroy our renderer object without worrying about ;name mangling. LIBRARY "GameD3DRenderer.dll" EXPORTS createRendererInterface destroyRendererInterface //now in our .cpp file HRESULT createRendererInterface(rendererInterface **pInterface) { if(!*pInterface) { //convert our interface pointer to a D3DRenderer object //note: that in our GameOGLRenderer project, we just //need to replace the following class with OGLRenderer *pInterface = new D3DRenderer; return S_OK; } return E_FAIL; } // Release our Handle to the class HRESULT destroyRendererInterface(rendererInterface **pInterface) { if(!*pInterface) { return E_FAIL; } delete *pInterface; *pInterface = 0; return S_OK; } The two functions above should be clear enough. We're taking as input the rendererInterface object, which we use to properly create and destroy an instance of our D3DRenderer class, which is the Direct3D implementation of our rendererInterface.
|
|