グラフィックを読み込む

長い前置きが終わっていよいよグラフィックを扱います。

ゲームの元になるプロジェクトのタイプは何が良いでしょうか。

VBなどから移ってきた人はダイアロブベースにPICTURを乗せてそれを
触るのがやりやすいかもしれません。

ここでは、SDIを選択します。
いろいろな設定でメニューバーを使いたいのが主な理由です。
ダイアログベースにすると、設定のウィンドウなどを自分で作る必要があります。

ゲームのベースになるプロジェクトは、 rpg とします。

ファイル >> 新規作成 >> プロジェクト >> MFC AppWizard(exe)
を選択します。

プロジェクト名は、rpg にします。

ステップ1で SDI(S)を選択します。
ステップ2、3、はそのまま

ステップ4は、
3Dコントロールのチェックを残してほかのチェックははずします。
最新ファイルの一覧に表示するファイルの数(R) は1にしておきます。

詳細設定のウィンドウスタイルは、最大化ボタンとシステムメニュー以外のチェックは全部はずします。
あとは終了で終わり。

ゲーム用プロジェクトが出来ました。

次にリソースにビットマップを読み込みます。
リソースというのは、プログラムで使うデータをまとめたものです。
リソースに読み込んでおくと、プログラムの中で簡単に使うことができます。

ここでは、ウィンドウズディレクトリの花見.bmpを使うことにします。

ビットマップをリソースに読み込む方法は、

1 VC++のメニューの挿入を選択する
2 リソースを選択する。すると、リソースの挿入ダイアログが出る
3 Bitmapを選択して、インポートボタンを押す
4 リソースのインポートダイアログがでるので、ファイル名のことろに
  *.bmp と打ち込んでリターンキーを押す。
5 すると、ビットマップファイルとフォルダだけが見えるようになるので
  そこからウィンドウズディレクトリに移動して花見.bmpを選択して
  インポートボタンを押す。

ちゃんとリソースに読み込まれているか、確認してみましょう。
ワークスペースのリソースビューを表示させてください。
リソースをひらくと、Bitmap というフォルダがあるのでそれを開いてください。
ななに IDB_BITMAP1 というのがあればOKです。
試しにその IDB_BITMAP1 をダブルクリックしてみるとリソースエディタが立ち上がって今読み込んだCGが表示されましたね。

次には読み込んだこのファイルをプログラムで表示させるコードです。

ワークスペースのファイルビューを開いて Source Files を開きます。
rpgView.cpp というファイルをダブルクリックしてソースを開きます。

そのファイルの上の方に
 

 ////////////////////////////////////////////////////////
 // CRpgView クラスの描画
 void CRpgView::OnDraw(CDC* pDC)
 {
 

と書いてある関数があります。

そのなかに以下のコードを打ち込んで下さい。
 

 CBitmap Bitmap;
 CDC DC;
 DC.CreateCompatibleDC(0);
 Bitmap.LoadBitmap(IDB_BITMAP1);
 
 DC.SelectObject(&Bitmap);
 pDC->BitBlt(128,128,32,32,&DC,0,0,SRCCOPY);
 

打ち込んだらビルドして実行です。
ちゃんと出ましたか?

ビルドでエラーが出たら、タイピングミスを見つけて下さい。
あるいはCGがちゃんとプロジェクトのディレクトリにあるか確認して下さい。

ちゃんとCGが表示されたら、それを並べ替えて背景の表示にかかります。

ここで今打ち込んだコードに付いて説明しておきます。

CBitmap Bitmap

の部分ですが、CBitmapクラスのオブジェクト Bitmapを使う
と宣言します。
CBitmapは、クラスです。
どんなクラスかというと読んでわかるとおり、ビットマップを保持するためのクラスです。
クラスですから、中にはメンバ変数やらメンバ関数やらが入っているわけです。

4行目の

Bitmap.LoadBitmap(IDB_BITMAP1);

は、このビットマップクラスのメンバ関数である、

LoadBitmap() を呼んでいます。

このメンバ関数は、リソースからビットマップを読み込んでメモリを確保してそこに保持します。

CDC DC;

これもクラスです。
CDCクラスのオブジェクト DC をつかいまっせ、という宣言です。
このクラスは、描画のためのクラスです。
画面やビットマップにCGをコピーするときに使います。

他にも使う場合がありますが、ここではビットマップのコピーの説明をします。

DCは、メンバ関数の CreateCompatibleDC() というメンバ関数でオブジェクトを作ります。

DC.SelectObject(&Bitmap);

は、DCオブジェクトにビットマップを扱うように関連をつけています。
DCは、ビットマップのポインタを受け取ってこのビットマップが扱えるように
なりました。

pDC->BitBlt(128,128,32,32,&DC,0,0,SRCCOPY);

ここが画面に転送する本体の関数呼び出しです。

pDC というのは、メインのウィンドウのDCのポインタです。

これはウィンドウの画面のDCです。
この画面のDCのメンバ関数である、BitBlt を呼び出してDCが持っているビットマップの内容をコピーします。

DCの持っているもの(つまりリソースから読み込んだビットマップ)をpDCが持っているもの(つまり画面)にコピーしました。

ここで一つ、メンバ関数の呼び出しかたですが

DCのほうは

DC.SelectObject(&Bitmap);

で、pDCの方はポインタなので

pDC->BitBlt(128,128,32,32,&DC,0,0,SRCCOPY);

になっているのにも注意しましょう。
ちなみに pDC はどこで定義されているかというと、

void CRpgView::OnDraw(CDC* pDC)

のように関数が呼ばれるときに引数としてウィンドウズから渡されます。