BaseDrawManager実装例
以下に、BaseDrawManagerの具象化クラスを擬似コードで示します。
class DrawManagerImpl : public BaseDrawManager{ public: //コンストラクタ DrawManagerImpl(CGraphicSystem* GS, D3DCOLOR ColorKey = 0){ m_GS = GS; m_ColorKey = ColorKey; } //画面の横幅を取得 unsigned int GetScreenWidth() const{ return(m_GS->GetScreenWidth()); } //画面の縦幅を取得 unsigned int GetScreenHeight() const{ return(m_GS->GetScreenHeight()); } //フルスクリーンか否かを取得 bool GetFullScreen() const{ return(m_GS->GetFullScreen()); } //フルスクリーンか否かを設定 void SetFullScreen(bool IsFullScreen){ m_GS->SetFullScreen(IsFullScreen); } //画面を更新 void Flip(){ m_GS->Present(); } private: CGraphicSystem* m_GS; //グラフィック描画システムクラスへのポインタ D3DCOLOR m_ColorKey; //カラーキー map<string, CDraw*> m_DrawMap; //画像描画用(抜き色あり) map<string, CDraw*> m_DrawFastMap; //画像描画用(抜き色なし) bool _LoadImage(const char* FileName){ if(m_DrawFastMap.find(FileName)==m_DrawFastMap.end()){ m_DrawFastMap->insert(pair<string, CDraw*>(FileName, new CDraw(FileName)); if(m_ColorKey!=0){ m_DrawMap->insert(pair<string, CDraw*>(FileName, new CDraw(FileName, m_ColorKey)); } return(true); } return(false); } bool _UnloadImage(const char* FileName){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ delete(m_DrawFastMap.find(FileName)->second); m_DrawFastMap.erase(m_DrawFastMap.find(FileName)); } if(m_DrawMap.find(FileName)!=m_DrawMap.end()){ delete(m_DrawMap.find(FileName)->second); m_DrawMap.erase(m_DrawMap.find(FileName)); } return(true); } void _Clear(COLORREF Color){ m_GS->Clear(COLORREFTOD3DCOLOR(Color)); } void _Blt(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ if(m_ColorKey==0){ m_DrawFastMap.find(FileName)->second->Blt(x, y, a, &SrcRect); } else{ m_DrawMap.find(FileName)->second->Blt(x, y, a, &SrcRect); } } } void _AddBlt(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ if(m_ColorKey==0){ m_DrawFastMap.find(FileName)->second->AddBlt(x, y, a, &SrcRect); } else{ m_DrawMap.find(FileName)->second->AddBlt(x, y, a, &SrcRect); } } } void _SubBlt(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ if(m_ColorKey==0){ m_DrawFastMap.find(FileName)->second->SubBlt(x, y, a, &SrcRect); } else{ m_DrawMap.find(FileName)->second->SubBlt(x, y, a, &SrcRect); } } } void _BltFast(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ m_DrawFastMap.find(FileName)->second->Blt(x, y, a, &SrcRect); } } void _AddBltFast(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ m_DrawFastMap.find(FileName)->second->AddBlt(x, y, a, &SrcRect); } } void _SubBltFast(const string& FileName, int x, int y, BYTE a, RECT SrcRect){ if(m_DrawFastMap.find(FileName)!=m_DrawFastMap.end()){ m_DrawFastMap.find(FileName)->second->SubBlt(x, y, a, &SrcRect); } } void _DrawFreeText(const string& Text, int x, int y, BYTE a, const string& Font, unsigned int Size, COLORREF Color, bool IsBold, bool IsItalic){ BYTE r, g, b; r = GetRValue(Color); g = GetGValue(Color); b = GetBValue(Color); m_GS->DrawText(Text, x, y, D3DCOLOR_ARGB(a, r, g, b), Font, Size, IsBold, IsItalic); } void _DrawRect(RECT Rect, COLORREF Color, BYTE a){ BYTE r, g, b; r = GetRValue(Color); g = GetGValue(Color); b = GetBValue(Color); m_GS->DrawRect(Rect, D3DCOLOR_ARGB(a, r, g, b)); } DrawManagerImpl(); //デフォルトコンストラクタ(禁止) DrawManagerImpl(const DrawManagerImpl&); //コピーコンストラクタ(禁止) DrawManagerImpl& operator =(const DrawManagerImpl&); //代入演算子(禁止) };
※1:上記擬似コードは、Direct Xベースのライブラリで実装した場合を想定しています。
※2:map<string, CDraw*>がふたつあるのは、それぞれ抜き色ありと抜き色なしの場合に使用するためです。