キャラクタを出す

背景が出来たところで、キャラクタを重ね、さらに動かしてみます。
まずは、背景にキャラクタを転送します。
そのときに、キャラクタの抜き部分をちゃんと透明に転送しなければなりません。
それには、以下のようにします。

キャラクタの転送には、抜き部分を黒にするか、白にするか、という二通りの方法があります。
常識的には黒にすると思いますが、キャラクタ自体の周り(髪の毛とか)が黒だとそれが透けてしまいます。
その場合は灰色、と言っても人間の目には黒に見えるような灰色を使う必要があります。
真っ黒の場合はいっそ、周りを白にしても良いのですが、そうするとほかのキャラクタも透明色が白になります。
どんな色調のキャラクタになるか、予測して決めましょう。

重ねるためのキャラクタは、

1 透明色が黒の色付きキャラCG
2 キャラ部分が黒、透明色部分が白のマスク用CG

の2枚を用意します。

ここで、キャラ動かし用の関数も追加しておきましょう。

上でやった DrawBack() と同じように

void MoveChara(CDC* pDC,int x,int y)

という関数を rpgView.h に宣言し rpgView.cpp に本体を定義します。

本体の定義は、
 

 void CRpgView::MoveChara(CDC* pDC,int x, int y)
 {
 CBitmap a;
 CDC cgDC;
 cgDC.CreateCompatibleDC(0);
 a.LoadBitmap(IDB_BITMAP3);
 
 cgDC.SelectObject(&a);
 
 pDC->BitBlt(x,y,32,32,&cgDC,0,0,SRCCOPY);
 
 // cgDC.SelectObject(&h);
 // pDC->BitBlt(x,y,32,32,&cgDC,0,0,SRCPAINT);
 // cgDC.SelectObject(&g);
 // pDC->BitBlt(x,y,32,32,&cgDC,0,0,SRCAND);
 
 }
 

ついでにXとYの位置を保存しておくための変数も作っておきます。
 

int posi_x;
int posi_y
 

これは、ヘッダファイルの protected の所に書いておきます。

 posi_x と posi_y にはちゃんと値をセットしないと表示されません。CRpgView のコンストラクタにて0を入れておきましょう。
 

 CRpgView::CRpgView() 2001-6-24 更新
 {
 // TODO: この場所に構築用のコードを追加してください。
 
  posi_x = 0;
  posi_y = 0;
 
 }
 

rpgView クラスの中にいろいろ書き込みが増えてきてだんだんいやんな気分になって
きましたね。
これでキャラが増えたりすると、ごちゃごちゃになりそうです。
でももうちょっと我慢します。

透明色マスクが無いのでとりあえず、出すだけ出しましょう。
もちろんマスクがちゃんとある場合はここで、コメントアウトした処理をします。

どうですか、ちゃんとでましたか?
出ない場合は 「グラフィックを読み込む」 に書いてある、動かない場合のチェックをもう一度やってみます。
キャラクタが出たら次です。

透明転送     
上のコードではキャラクタの周りに四角い枠が出てしまいます。
キャラクタの周りに背景を透けさせなければいけませんね。

でキャラクタの転送部分を以下のように変更してください。
 

 void CRpgView::MoveChara(CDC* pDC,int x,int y)
 {
 CDC cgDC;
 cgDC.CreateCompatibleDC(0);
 
 //マスクを使用して透過処理をする
 
  CBitmap h;
  h.LoadBitmap(IDB_BITMAP4);
  cgDC.SelectObject(&h);
  pDC->BitBlt(x,y,32,32,&cgDC,0,0,SRCAND); // キャラ部分をくりぬく
 
  CBitmap g;
  g.LoadBitmap(IDB_BITMAP3);
  cgDC.SelectObject(&g);
  pDC->BitBlt(x,y,32,32,&cgDC,0,0,SRCINVERT); // くりぬいた部分に描画する
 
 }
 

使用する絵は、以下の三つ ええかげんですみません・・・
背景 マスク 透明部分が白 キャラ 透明部分が黒

実行結果は、以下のとおり