C言語ゲームプログラミング 第12回講座




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



1.背景上にビットマップを重ねて表示

今回は、背景が描かれている画面上にビットマップを描く方法について解説します。 背景となる手頃なビットマップは、c:\windows\ディレクトリ下にあるのでOSの種類に応じてプログラムを変更してください。 XPではシャボン.bmpというファイルがあると思いますが、他のOSはたぶん雲.bmpなどにする必要があると思います。

背景上には次のビットマップを表示するので、
正方形を90度回転させた図形
右ボタンメニューの「名前を付けて画像を保存」でダウンロードしてください。

表示するプログラムは、ビットマップ表示のテストに使った物とほとんど同じですが、背景と四角の両方のビットマップをロードし表示しています。

#include <graph.h>

main()
{
        HBITMAP hbmp_base, hbmp_square;

        //hbmp_base = gl_loadbitmap("c:\\windows\\雲.bmp");
        hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
        hbmp_square = gl_loadbitmap("square.bmp");
        if(hbmp_base == NULL || hbmp_square == NULL){
                printf("ビットマップファイルが見つかりません.\n");
                exit(0);
        }
        gl_openwin(-1, -1, 256, 256, 0);
        gl_drawbitmap(hbmp_base, 0, 0, 256, 256, 0, 0);
        gl_drawbitmap(hbmp_square, 128-32, 128-32, 64, 64, 0, 0);
}

このプログラムを実行した結果は次のようになると思います。
背景上へのビットマップ表示


2.マスクパターンビットマップを使用しての表示

四角のビットマップのうち黒の部分は背景が描画されるようにしたいのですが、今までに説明した方法では、このようにしか表示することができません。 一部分は背景が透けてみるような描画を行うにはgl_drawbitmap関数ではなく、gl_maskdrawbitmap関数を使用します。 gl_maskdrawbitmap関数には新たにパラメータが1つ追加されています(他のパラメータは同じです)。 新たに追加されたパラメータには、背景を透過させる部分とそうでない部分を区別(マスクパターン)するためのビットマップ(ハンドル)を指定します。 マスクパターンビットマップは、白黒で指定します。白の部分は背景を透過させ黒の部分は背景は使わず前景(描画するビットマップ)を描画します。 次のマスクパターンビットマップを用意したのでいつものように右ボタンメニューの「名前を付けて画像を保存」でダウンロードしてください。

マスクパターンビットマップは、多くの場合描画するビットマップ(この場合square.bmp)を加工することで半自動的に変換することができます。

マスクパターンビットマップをロードしてgl_maskdrawbitmap関数で描画した例は次のようになります。

#include <graph.h>

main()
{
        HBITMAP hbmp_base, hbmp_square, hbmp_squaremask;

        //hbmp_base = gl_loadbitmap("c:\\windows\\雲.bmp");
        hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
        hbmp_square = gl_loadbitmap("square.bmp");
        hbmp_squaremask = gl_loadbitmap("square_bw.bmp");
        if(hbmp_base == NULL || hbmp_square == NULL || hbmp_squaremask == NULL){
                printf("ビットマップファイルが見つかりません.\n");
                exit(0);
        }
        gl_openwin(-1, -1, 256, 256, 0);
        gl_drawbitmap(hbmp_base, 0, 0, 256, 256, 0, 0);
        gl_maskdrawbitmap(hbmp_square, hbmp_squaremask, 128-32, 128-32, 64, 64, 0, 0);
}

このプログラムの実行結果は次のようになります。
マスクパターンを使用した背景上へのビットマップ表示
これで期待通りに描画されました。
gl_maskdrawbitmap関数の処理内容はおおよそ次のようになります。 (1)マスクパターンビットマップの白を1、黒を0として背景画像に対してAND演算を行います。
(2)マスクパターンビットマップの白に部分の背景は残り、黒の部分の背景は黒(消されます)となります。
(3)描画するビットマップを、背景画像に対してOR演算を行います。