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