その8 ビットマップの表示

今章は「ビットマップの表示」です

「ロールプレイングゲームの作成」は
今章にまとめると長くなりそうなので
《総集編》として次章で解説します




さて、
”ビットマップ”とは何でしょう?


簡単に言うと
「色を識別する数字の集合体」です





”ドット絵”をご存じでしょうか

が幾つも合わさって
ひとつの「絵」になったものです


にはひとつの色が割り当てられています





実は、パソコンで表示されるもの
というよりTVで表示される全てのもの
”ドット絵”と全く同じなのです


の数を多くすればするほど
より現実に近い画像となります


多くあればいいというものではなく、
近年の”ドット絵”
いかに少ない「絵」を表現できるかの
非常に高い技術の分野へと進化しています






Windows標準アクセサリの
「ペイント」
を起動して、適当に絵を描いてみてください


描いた絵を保存する時に
「.BMP」
という拡張子を選べると思います




この形式で保存したものが「ビットマップ」です


「.BMP」ファイルは
Windowsプログラミングで最も扱いやすい
画像ファイルです







適当にキャラクターの絵を描いてみましょう


ー +ー


こんな感じでもOKです






絵を描く上で大事な事


絵以外の透過表示させるところは
全て「白」で埋め尽くしてください

絵に「白」が含まれる場合、絵を透過表示させた時に
絵の白い部分が一緒に透過してしまいます



どうしても絵に「白」を使用したい場合は
透過表示させるところは
「黒」で埋め尽くしてください







それでは、ビットマップを表示させるプログラムを
作っていきましょう!


前章(マウス入力判定)で作ったプログラムをそのまま使用します


まずは、制作したBMPファイルを
プロジェクトに追加します


リソースビューの項目で右クリック
「リソースの追加」を選択



「インポート」を選択



「すべてのファイル」を表示させ、制作したBMPファイルを選択




これでプログラムで使用できるようになりました






まずは、ビットマップを読み込むために
HBITMAP型の構造体hbitを用意


Windowsでの描画処理には【デバイスコンテキスト】
というものを使用するのでHDC型の構造体dcMem1を用意します





【デバイスコンテキスト】って何??


と、思うと思います
”描画・表示用のページ”と思ってください

dcMem1のページには後で、さっき追加したビットマップを登録します






そして、これらの構造体を《グローバル変数》で定義した理由は
複数の関数で使用するからです

関数内で定義した変数は
関数が結果を返したら消滅します

これを防ぐためです





ビットマップの読み込みは
初期化時(Windowが表示される前)に行います



初期化の関数はBOOL InitInstance()です

//ここ
と表示された場所で初期化処理をします





この3行を足してみて下さい



まず、hbitLoadBitmap()関数で
ビットマップを読み込みます


IDB_BITMAP1はプロジェクトに画像を追加した際の識別子
それを認識させるためにMAKEINTRESOURCEマクロを使用します





う~ん・・
よくわかんなくなってきたな・・





とりあえず丸写しで大丈夫です
画像を何枚も追加したり、色々いじってるうちに再度見直して

ああ、なるほどね


と思って頂ければいいと思います




プログラミングは動くものをいじくり回す方が
何もないところから作り上げるより簡単で挫折も少ないです

ここまで書いといて何ですが、
今は画像が表示できれば細かい説明はどうでもいいのです




いよいよ最後、ビットマップの表示です


前章で作ったWM_LBUTTONDOWNの上に
WM_PAINTメッセージを処理するプログラムがあります



画像を表示するBitBlt()関数を上のように記入してください


第1引数:hdcは、Window描画用に用意された【デバイスコンテキスト】です

第2引数:ビットマップを表示するWindow x座標
第3引数:ビットマップを表示するWindow y座標
第4引数:表示する幅
第5引数:表示する高さ

第6引数:ビットマップが格納された【デバイスコンテキスト】

第7引数:第6引数のビットマップのどの位置から表示させるか x座標
第8引数:第6引数のビットマップのどの位置から表示させるか y座標

第9引数:転送形式(後で補足)



Windowが無くなる時、
hbitdcMem1を開放します





実行結果



やったー!!
自分の作ったキャラが・・表示された!!





お疲れ様でした

これで絵が表示され
ロールプレイングゲーム作成の準備は整ってきました




・・せっかくなので、
動かしてみたいと思いませんか?






 キャラクターを指定の場所へ移動させる 



前章でマウス入力と判定を行ったプログラムがあるので
ちょっと細工してみましょう



まず、POINT構造体ptをグローバルに変更
ついでにoldptも追加で作成します



oldptには、ひとつ前にクリックされたptの座標が入ることになります





WM_PAINT以下を上のように変更して下さい


まず、WM_LBUTTONDOWNでマウスクリックされた時、
oldptptの値を写します



前章同様にptにクリックされた座標を拾う



InvalidateRect()関数とUpdateWindow()関数で
WM_PAINTメッセージを発生させる



今回のクリックよりひとつ前にクリックされたoldptの座標に
BitBlt 第9引数に”WHITENESS”を指定して真っ白な画像を描画
前の画像を消します



今クリックされたptの座標に
通常通りビットマップを表示させます






実行結果



おういえ~!
クリックした場所に付いてくるじゃないですか~!!



次章「ロールプレイングゲームの作成」では
数字の上を歩かせての移動を行うのですが、

実はこのまま次章に突入すると不具合があります




”WHITENESS”BitBlt()を消せば分かるのですが
画像の白い部分もそのまんま、四角く表示されてしまっています




//トランス表示
以下を表示用のBitBlt()と置き換えて下さい



何をしているかというと
ビットマップを1ドットずつ走査して
RGB(255,255,255)
「白」じゃなければ描画する
という処理をしています






実行結果


画像の白い部分がくり抜かれて描画されています


「四角い画像が歩くRPG」
にならずに済みました



「ビットマップの表示」は以上です
本当にお疲れ様でした


いよいよ次章は「ロールプレイングゲームの作成」
これまでの全章を総動員してプログラミングします



ちょっと難しすぎるよ・・


と思った方、大丈夫です

そのまんま入力すればRPGが出来るようにします

プログラム中のマップやデータをいじって
オリジナルのRPGを作ってみてください!