フォーラムルールは目を通しましたが、
間違っている部分等有りましたら、ご指摘、お願い致します。
一応分からないところなどはGoogle先生に聞いてみたのですが、
私の検索する能力が弱い?為か、あまりhitしませんでした...
ですので、ここで質問させて頂きます。
それからプログラム経歴は2週間程でまだまだひよっこです。
用語など、大きく間違っている可能性もあります...
それでも見ていただけると嬉しいです。
前置きが長くなってしまいましたが、本題に入ろうと思います。
現在描画クラスなるものを作成しています。
描画する際にCDraw(描画クラス)のint Draw(void)を呼び出すだけで各種描画が出来る様になっています。
// 描画する数
const int DRAW_NUM = 2;
// 以下のようにnewで使用するクラスを生成します。
CDraw *pDraw[DRAW_NUM] = new CDraw(); // 描画管理
CDraw *pImg = new CGraph(); // 画像
CDraw *pBox = new CBlock(); // 図形
// 描画するものは全てこのpDrawへ
pDraw[0] = pImg; // 画像
pDraw[1] = pBox; // 図形
// 画像の読み込み等を行います
pImg->GSHandle("Dat/Gph/Test.png");
if (pImg->GSHandle() == -1) return -1;
// その後、void GSDrawFlag(bool)で描画フラグをtrueにし、
pImg->GSDrawFlag(true); // 描画対象にする
pBox->GSDrawFlag(true); // 描画対象にする
// int Draw(void)を呼び出すと各クラスごとにオーバーロードした描画関数が呼び出される、といった仕組みです。
for (int i = 0; i < DRAW_NUM; i++) {
pDraw[i]->Draw();
}
そうなると無駄な仮想関数が増え、メモリの消費も微々たるものですが、あまり宜しくないかと思いました。
この描画方法以外に何かないでしょうか?
やりたい事としては、以下の3つです。
・カプセル化(現状で出来ているかどうかも怪しいですが)
・メモリの節約(出来れば)
・一つの描画関数で描画(オーバーロードをしたりして、呼び出すときは上の例の様に描画関数をfor文で回したいと思っています。)
ヒントだけでも良いので、ご教授のほど宜しくお願いします。
使用環境
OS : windows8
コンパイラ : Visual Studio Express 2012 for Windows Desktop
ライブラリ : DXライブラリ
以下、現在のソースコードになります。
(フィールド内描画は縦スクロールシューティングゲームのフィールド内の描画を行うべく、
X座標、Y座標にフィールドの左上座標を足して、描画位置をフィールド内にずらしている物です。)
一応記載(分からなくなるといけないので)
class CBattle {
public:
static const int STAGE_SX = 64; // フィールドの左上X座標
static const int STAGE_SY = 32; // フィールドの左上Y座標
};
/*h*/
// 描画クラス
class CDraw {
public:
CDraw(void) :
DrawFlag(false), Blend(255), X(0), Y(0) {} // コンストラクタ
~CDraw(void) {} // デストラクタ
int Draw(void); // 描画
bool GSDrawFlag(void) { return DrawFlag; } // 描画フラグの取得
void GSDrawFlag(bool i) { DrawFlag = i; } // 〃 の設定
int GSBlend(void) { return Blend; } // 透明度の取得
void GSBlend(int i) { Blend = i; } // 〃 の設定
float GSX(void) { return X; } // X座標の取得
void GSX(float i) { X = i; } // 〃 の設定
float GSY(void) { return Y; } // Y座標の取得
void GSY(float i) { Y = i; } // 〃 の設定
// 仮想関数
virtual int DrawSystem(void) = 0; // 描画方式
// 画像用
virtual int GSHandle(void) { return 0; } // 画像ハンドルの取得
virtual void GSHandle(int i) {} // 〃 の設定
virtual float GSSize(void) { return 0.0; } // 大きさの取得
virtual void GSSize(float i) {} // 〃 の設定
virtual float GSAgl(void) { return 0.0; } // 角度の取得
virtual void GSAgl(float i) {} // 〃 の設定
virtual bool GSFlag(void) { return false; } // 透過フラグの取得
virtual void GSFlag(bool i) {} // 〃 の設定
virtual bool GSTurnFlag(void) { return false; } // 反転フラグの取得
virtual void GSTurnFlag(bool i) {} // 〃 の設定
// 図形用
virtual float GSX2(void) { return 0.0; } // 右下X座標の取得
virtual void GSX2(float i) {} // 〃 の設定
virtual float GSY2(void) { return 0.0; } // 右下Y座標の取得
virtual void GSY2(float i) {} // 〃 の設定
virtual int GSColor(void) { return 0; } // 色情報の取得
virtual void GSColor(int i) {} // 〃 の設定
virtual bool GSFillFlag(void) { return false; } // 塗り潰しフラグ
virtual void GSFillFlag(bool i) {} // 塗り潰しフラグ
// ここに文字列の描画を管理する関数を追加する予定
private:
bool DrawFlag; // 描画フラグ
int Blend; // 透明度
float X, Y; // XY座標
};
// 画像クラス(DrawGraph用)
class CGraph : public CDraw {
public:
CGraph(void) : Flag(true), TurnFlag(false) {} // コンストラクタ
~CGraph(void) {} // デストラクタ
int DrawSystem(void); // 描画方式
int GSHandle(void) { return Handle; } // 画像ハンドルの取得
void GSHandle(int i) { Handle = i; } // 〃 の設定
bool GSFlag(void) { return Flag; } // 透過フラグの取得
void GSFlag(bool i) { Flag = i; } // 〃 の設定
bool GSTurnFlag(void) { return TurnFlag; } // 反転フラグの取得
void GSTurnFlag(bool i) { TurnFlag = i; } // 〃 の設定
private:
int Handle; // 画像ハンドル
bool Flag; // 透過フラグ
bool TurnFlag; // 反転フラグ
};
// 画像クラス(DrawGraph用、フィールド内描画)
class CGraphF : public CGraph {
public:
int DrawSystem(void); // 描画方式
};
// 画像クラス(DrawRotaGraph用)
class CGraphRota : public CDraw {
public:
CGraphRota(void) : Size(1.0),
Agl(0.0), Flag(true), TurnFlag(false) {} // コンストラクタ
~CGraphRota(void) {} // デストラクタ
int DrawSystem(void); // 描画方式
int GSHandle(void) { return Handle; } // 画像ハンドルの取得
void GSHandle(int i) { Handle = i; } // 〃 の設定
float GSSize(void) { return Size; } // 大きさの取得
void GSSize(float i) { Size = i; } // 〃 の設定
float GSAgl(void) { return Agl; } // 角度の取得
void GSAgl(float i) { Agl = i; } // 〃 の設定
bool GSFlag(void) { return Flag; } // 透過フラグの取得
void GSFlag(bool i) { Flag = i; } // 〃 の設定
bool GSTurnFlag(void) { return TurnFlag; } // 反転フラグの取得
void GSTurnFlag(bool i) { TurnFlag = i; } // 〃 の設定
private:
int Handle; // 画像ハンドル
float Size; // 大きさ
float Agl; // 角度
bool Flag; // 透過フラグ
bool TurnFlag; // 反転フラグ
};
// 画像クラス(DrawRotaGraph用、フィールド内描画)
class CGraphRotaF : public CGraphRota {
public:
int DrawSystem(void); // 描画方式
};
// 図形クラス
class CBlock : public CDraw {
public:
CBlock(void) : X2(0.0),
Y2(0.0), FillFlag(true) {} // コンストラクタ
~CBlock(void) {} // デストラクタ
int DrawSystem(void); // 描画方式
float GSX2(void) { return X2; } // 右下X座標の取得
void GSX2(float i) { X2 = i; } // 〃 の設定
float GSY2(void) { return Y2; } // 右下Y座標の取得
void GSY2(float i) { Y2 = i; } // 〃 の設定
int GSColor(void) { return Color; } // 色情報の取得
void GSColor(int i) { Color = i; } // 〃 の設定
bool GSFillFlag(void) { return FillFlag; } // 塗り潰しフラグ
void GSFillFlag(bool i) { FillFlag = i; } // 塗り潰しフラグ
private:
float X2, Y2; // 右下XY座標
int Color; // 色情報
bool FillFlag; // 塗りつぶしフラグ
};
// 図形クラス(フィールド内描画)
class CBlockF : public CBlock {
public:
int DrawSystem(void); // 描画方式
};
/*cpp*/
//------------------------------------------------------------------------------
// 概略 : 画像の描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 画像の描画を行います。
// Blendの値が大きい程不透明に、小さい程透明になる様描画します。
//------------------------------------------------------------------------------
int CDraw::Draw(void)
{
if (GSDrawFlag()) {
if (SetDrawBlendMode(DX_BLENDMODE_ALPHA, GSBlend()) == -1) return -1;
if (DrawSystem() == -1) return -1;
if (SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0) == -1) return -1;
}
// 成功
return 0;
};
//------------------------------------------------------------------------------
// 概略 : 画像の描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 画像の描画を行います。
//------------------------------------------------------------------------------
int CGraph::DrawSystem(void)
{
if (!GSTurnFlag()) {
if (DrawGraphF(GSX(), GSY(), GSHandle(), GSFlag()) == -1) return -1;
} else {
if (DrawTurnGraphF(GSX(), GSY(), GSHandle(), GSFlag()) == -1) return -1;
}
// 成功
return 0;
}
//------------------------------------------------------------------------------
// 概略 : 画像のフィールド内描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 画像のフィールド内描画を行います。
//------------------------------------------------------------------------------
int CGraphF::DrawSystem(void)
{
if (!GSTurnFlag()) {
if (DrawGraphF(GSX() + CBattle::STAGE_SX, GSY() + CBattle::STAGE_SY, GSHandle(), GSFlag()) == -1) return -1;
} else {
if (DrawTurnGraphF(GSX() + CBattle::STAGE_SX, GSY() + CBattle::STAGE_SY, GSHandle(), GSFlag()) == -1) return -1;
}
// 成功
return 0;
}
//------------------------------------------------------------------------------
// 概略 : 画像の描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 画像の描画を行います。
// サイズ指定や角度の変更が出来ます。
//------------------------------------------------------------------------------
int CGraphRota::DrawSystem(void)
{
return DrawRotaGraphF(GSX(), GSY(),
GSSize(), GSAgl(), GSHandle(), GSFlag(), GSTurnFlag());
}
//------------------------------------------------------------------------------
// 概略 : 画像のフィールド内描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 画像のフィールド内描画を行います。
// サイズ指定や角度の変更が出来ます。
//------------------------------------------------------------------------------
int CGraphRotaF::DrawSystem(void)
{
return DrawRotaGraphF(GSX() + CBattle::STAGE_SX,
GSY() + CBattle::STAGE_SY, GSSize(), GSAgl(), GSHandle(), GSFlag(), GSTurnFlag());
}
//------------------------------------------------------------------------------
// 概略 : 図形の描画
// 引数 : なし
// 戻り値 : 0 : 成功
// -1 : エラー発生
// 解説 : 図形の描画を行います。
//------------------------------------------------------------------------------
int CBlock::DrawSystem(void)
{
// 選択カーソルの描画
return DrawBox((int)GSX(), (int)GSY(),
(int)GSX2(), (int)GSY2(), GSColor(), GSFillFlag());
}