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 |