>> ブロック崩しプログラミング入門トップに戻る
今回はブロックの表示について説明します。
block.hとblock.cppを見てください。
BLOCKクラスは以下のように定義されています。
これらの変数を全て使います。
まずコンストラクタで画像の読み込みを行っています。
説明する前に、今回のブロック崩しは同じ画像のブロックをいくつも並べるようにして、
配置するようにします。
そのため、読み込む画像は一つだけでよくなります。
つまり一度読み込んでしまえば、もう読み込む必要はないですよね?
そのため、最初の読み込みの部分では一度読み込んだら、もう読み込まないように工夫をしています。
BLOCKクラスのグラフィックハンドル用の変数ghにはstatic指定子が付いています。
つまり、BLOCKクラスをいくつ作っても、この変数はいくつも生成されずに一つだけになり、
生成されるインスタンスで共有されることになります。
初期値で-1を代入していますが、最初のif文ではghが-1のときしか読み込まないようにしています。
つまり最初は必ず読み込まれますが、次のインスタンスが生成されたときには、
既に変数ghにはグラフィックハンドルが入っているので、再度読み込まれることはありません。
これで、同じ画像を何回も読み込むというリソースの無駄遣いを無くすことが出来ます。
次のブロックの座標ですが、コンストラクタの引数をそのまま座標に設定するようにしています。
このBLOCKクラスを生成するのは、親のCONTROLクラスです。
そのCONTROLクラス内でBLOCKクラスを生成するときに座標を指定して、生成します。
endflagはそのインスタンスのブロックが壊れているか壊れていないかを示すためのものです。
最初は壊れてないのでfalseを指定してます。
その下のcount変数ですが、壊れたブロックを消すときにただ消すだけじゃつまらないので、
徐々に透明にしながら、消していくようにします。
その時に、〇カウント経ったら消す!、という時に使うカウント用の変数です。
次にDraw関数を見てみましょう。
まず、最初のif文で、endflagをチェックしています。
falseの時はブロックが壊れていないので、そのまま描画しています。
次にendflagがtrueだったときの処理です。
今回ブロックがフェードして、画像が消えいくのにかかる時間は、40カウントとします。
40カウントということは、1ループが約16ミリ秒ですから、640ミリ秒ぐらい。つまり0.64秒ぐらいです。
まず、40カウント立っていれば、もう描画する必要はないので、その場合は何もしません。
カウントが40カウント以内の時に透明度を指定して描画するようにします。
まず、SetDrawBlendMode関数で、DX_BLENDMODE_ALPHAを指定してます。
これで透明度を指定して描画できるようになるのは覚えてますよね?
次にその第二引数に透明度を指定します。
0が完全透明で255が不透明です。
255÷40で1ループ分のアルファ値の値が求められます。
これに(40-count)の値をかけてやることで、大きな値から徐々に減少していくアルファ値が求められます。
あとはDrawGraphで普通に描画するだけです。
これで段々とフェードしながら消えていく描画ができます。
最後にDX_BLENDMODE_NOBLENDにして設定を戻すのを忘れないで下さい。
今回の説明はここまで。
次回はCONTROLクラスでの各クラスの生成について説明します。
>> 【CONTROLクラスでの各クラスの生成】に進む
>> ブロック崩しプログラミング入門トップに戻る
ブロックの表示
block.hとblock.cppを見てください。
BLOCKクラスは以下のように定義されています。
#include "pch.h" class BLOCK{ private: //座標 int x,y; //縦、横幅 int width,height; //ブロックが壊れてるか壊れてないかのフラグ。 bool endflag; //グラフィックハンドル。 //全部同じ画像なので静的変数にして共有。 static int gh; //フェード描画用カウント int count; private: void Draw(); public: int GetX(); int GetY(); int GetWidth(); int GetHeight(); void SetFlag(bool); bool GetFlag(); BLOCK(char *,int,int); void All(); };
これらの変数を全て使います。
まずコンストラクタで画像の読み込みを行っています。
int BLOCK::gh=-1; BLOCK::BLOCK(char *filename,int x,int y) { //最初しか読み込まない。 if(gh==-1) gh = LoadGraph("block.bmp"); GetGraphSize(gh,&width,&height); endflag=false; this->x=x; this->y=y; count=0; }
説明する前に、今回のブロック崩しは同じ画像のブロックをいくつも並べるようにして、
配置するようにします。
そのため、読み込む画像は一つだけでよくなります。
つまり一度読み込んでしまえば、もう読み込む必要はないですよね?
そのため、最初の読み込みの部分では一度読み込んだら、もう読み込まないように工夫をしています。
BLOCKクラスのグラフィックハンドル用の変数ghにはstatic指定子が付いています。
つまり、BLOCKクラスをいくつ作っても、この変数はいくつも生成されずに一つだけになり、
生成されるインスタンスで共有されることになります。
初期値で-1を代入していますが、最初のif文ではghが-1のときしか読み込まないようにしています。
つまり最初は必ず読み込まれますが、次のインスタンスが生成されたときには、
既に変数ghにはグラフィックハンドルが入っているので、再度読み込まれることはありません。
これで、同じ画像を何回も読み込むというリソースの無駄遣いを無くすことが出来ます。
次のブロックの座標ですが、コンストラクタの引数をそのまま座標に設定するようにしています。
このBLOCKクラスを生成するのは、親のCONTROLクラスです。
そのCONTROLクラス内でBLOCKクラスを生成するときに座標を指定して、生成します。
endflagはそのインスタンスのブロックが壊れているか壊れていないかを示すためのものです。
最初は壊れてないのでfalseを指定してます。
その下のcount変数ですが、壊れたブロックを消すときにただ消すだけじゃつまらないので、
徐々に透明にしながら、消していくようにします。
その時に、〇カウント経ったら消す!、という時に使うカウント用の変数です。
次にDraw関数を見てみましょう。
void BLOCK::Draw() { //ブロックが壊れてないときだけ描画 if(!endflag){ DrawGraph(x-width/2,y-height/2,gh,FALSE); }else{ if(count<40){ //透過度を指定 SetDrawBlendMode(DX_BLENDMODE_ALPHA,(255/40)*(40-count)); //描画 DrawGraph(x-width/2,y-height/2,gh,FALSE); //設定を戻す SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); ++count; } } }
まず、最初のif文で、endflagをチェックしています。
falseの時はブロックが壊れていないので、そのまま描画しています。
次にendflagがtrueだったときの処理です。
今回ブロックがフェードして、画像が消えいくのにかかる時間は、40カウントとします。
40カウントということは、1ループが約16ミリ秒ですから、640ミリ秒ぐらい。つまり0.64秒ぐらいです。
まず、40カウント立っていれば、もう描画する必要はないので、その場合は何もしません。
カウントが40カウント以内の時に透明度を指定して描画するようにします。
まず、SetDrawBlendMode関数で、DX_BLENDMODE_ALPHAを指定してます。
これで透明度を指定して描画できるようになるのは覚えてますよね?
次にその第二引数に透明度を指定します。
0が完全透明で255が不透明です。
255÷40で1ループ分のアルファ値の値が求められます。
これに(40-count)の値をかけてやることで、大きな値から徐々に減少していくアルファ値が求められます。
あとはDrawGraphで普通に描画するだけです。
これで段々とフェードしながら消えていく描画ができます。
最後にDX_BLENDMODE_NOBLENDにして設定を戻すのを忘れないで下さい。
今回の説明はここまで。
次回はCONTROLクラスでの各クラスの生成について説明します。
>> 【CONTROLクラスでの各クラスの生成】に進む
>> ブロック崩しプログラミング入門トップに戻る