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*>がふたつあるのは、それぞれ抜き色ありと抜き色なしの場合に使用するためです。