C言語でグラフィックス 目次へ 
 前へ 【5】ビットマップ画像 次へ 

(2)ビットマップを動かす

◆サンプルプログラム 〔bitmap21.c〕
 ビットマップ画像を座標(100, 100)から右方向へ25ピクセルずつ移動する。

#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;
    int     bn, n;

    GWopen(0);
    GWsize(-5, &width, &height);
    GWsize(-3, NULL, NULL);
    GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
    GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    bn = GWloadbmp(0, "fig1.bmp");
    GWsetbmp(bn, 50.0, 50.0, 1, 1, 0);
    for(n = 0; n < 20; ++n){
        GWputbmp(bn, (float)n * 25.0 + 100.0, 100.0, 7);        /* 描画 */
        GWsleep(300);           /* 時間待ち(300ms) */
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}

 GWputbmp関数の描画フラグに7を指定しているので、ボールの移動のときと違って、描画した画像を消す必要はない。適当な時間待ちを入れて、座標を変えながら描画するだけでよい。
 実行すると、ビットマップ画像がGWウィンドウの左から右へ水平に移動する。

 

◆サンプルプログラム 〔bitmap22.c〕
 もう一枚ビットマップ画像を用意して、画像を切り替えながら前のサンプルと同じように移動する。
 画像のサイズは幅、高さともに50ピクセルとする。ビットマップのファイル名は「fig2.bmp」とし、プログラムファイルと同じフォルダに保存しておく。

 作成例 ファイル名
 fig2.bmp

 ビットマップ番号用に配列bnを用意して、fig1.bmpのビットマップ番号はbn[0]に、fig2.bmpのビットマップ番号はbn[1]に記憶する。
 ビットマップ番号bn[0]を描画した後にbn[1]を描画したとき、bn[0]の画像は消えないので消す処理が必要になる。ここでは、GWウィンドウの外に、実際には(-100, -100)に描画して消すようにしている。

#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;
    int     bn[2], n;

    GWopen(0);
    GWsize(-5, &width, &height);
    GWsize(-3, NULL, NULL);
    GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
    GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    bn[0] = GWloadbmp(0, "fig1.bmp");   /* 1枚目読み込み */
    GWsetbmp(bn[0], 50.0, 50.0, 1, 1, 0);
    bn[1] = GWloadbmp(0, "fig2.bmp");   /* 2枚目読み込み */
    GWsetbmp(bn[1], 50.0, 50.0, 1, 1, 0);
    for(n = 0; n < 20; ++n){
        GWputbmp(bn[n % 2], (float)n * 25.0 + 100.0, 100.0, 7);    /* 描画 */
        GWsleep(300);           /* 時間待ち(100ms) */
        GWputbmp(bn[n % 2], -100.0, -100.0, 7);    /* GWウィンドウ外に描画 */
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}

 ビットマップ画像bn[0]とbn[1]の切り替えは、「n % 2」で計算している。"%"は余りを計算する演算子で、nを2で割った余りの0または1が順に得られる。
 実行すると、ビットマップ画像が切り替わりながらGWウィンドウの左から右へ水平に移動する。

 

◆サンプルプログラム 〔bitmap23.c〕
 GWウィンドウのフレームで跳ね返る。ビットマップ画像をさらに2枚用意して、左右の移動方向によっても画像を変える。追加する画像は次のとおり。

 作成例 ファイル名
 fig3.bmp
    ファイル名
 fig4.bmp
#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;
    float   xx, dx, yy, dy;
    int     bn[4], n;
    char    *bfile[4] = {"fig1.bmp", "fig2.bmp", "fig3.bmp", "fig4.bmp"};

    GWopen(0);
    GWsize(-5, &width, &height);
    GWsize(-3, NULL, NULL);
    GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
    GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    dx = 15.0;        /* 移動量 */
    dy = 15.0;
    xx = (float)width / 2.5;        /* 初期位置 */
    yy = (float)height / 2.0;
    for(n = 0; n < 4; ++n){
        bn[n] = GWloadbmp(n + 1, bfile[n]);     /* bitmapファイル読み込み */
        GWsetbmp(bn[n], 50.0, 50.0, 1, 1, 0);   /* 属性設定 */
    }
    while(GWevent(NULL, NULL) == 0){
        if(dx > 0)
            GWputbmp(bn[0], xx, yy, 7);     /* 右方向へ移動 */
        else
            GWputbmp(bn[2], xx, yy, 7);     /* 左方向へ移動 */
        GWsleep(200);           /* 時間待ち(200ms) */
        GWputbmp(bn[0], -99.9, -99.9, 7);     /* 消去 */
        GWputbmp(bn[2], -99.9, -99.9, 7);     /* 消去 */
        xx = xx + dx;           /* 移動量計算 */
        yy = yy + dy;
        if(yy + 25.0 >= height){    /* 上の壁 */
            dy = -dy;
            yy = (float)height - 25.0;
        }else if(yy < 25.0){        /* 下の壁 */
            dy = -dy;
            yy = 25.0;
        }
        if(xx + 25.0 >= width){     /* 右の壁 */
            dx = -dx;
            xx = (float)width - 25.0;
        }else if(xx < 25.0){        /* 左の壁 */
            dx = -dx;
            xx = 25.0;
        }
        if(dx > 0)
            GWputbmp(bn[1], xx, yy, 7);     /* 右方向へ移動 */
        else
            GWputbmp(bn[3], xx, yy, 7);     /* 左方向へ移動 */
        GWsleep(200);           /* 時間待ち(200ms) */
        GWputbmp(bn[1], -99.9, -99.9, 7);     /* 消去 */
        GWputbmp(bn[3], -99.9, -99.9, 7);     /* 消去 */
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}


 前へ 次へ 
 Copyright © 2005 Hiroshi Masuda 

 

 

inserted by FC2 system