C言語でグラフィックス 目次へ 
 前へ 【4】グラフィックスを動かす 次へ 

 GWウィンドウ上に描画したグラフィックスを動かすプログラムを作成する方法を学習する。

(1)ボールを動かす

◆サンプルプログラム 〔mvball11.c〕
 ボール(円のグラフィックス)をGWウィンドウの左端から右端へ水平移動させる。
 円の初期値は、左図の通りとする。
 X座標の値を15ずつ加算してGWウィンドウ上に描画する。

#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;
    float   xx, dx, yy, rr = 20.0;

    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;        /* 移動量 */
    xx = 0.0;
    yy = 350.0;
    while(xx < (float)width){
        GWellipse(xx, yy, xx + rr, yy + rr);
        xx = xx + dx;        /* 移動量計算 */
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}

 X座標の変数xxにdxを加算していき、GWウィンドウの横幅widthより小さい間、繰り返すようにしている。

 実行すると、処理スピードが速いので一度に円が表示される。


◆サンプルプログラム 〔mvball12.c〕
 時間待ちの処理を追加する。また、次の円を描画するときに前の円を消す。
 処理の順序は次のようにする。

(1) 黒で円を描画する。
(2) 時間待ち(0.1秒)
(3) 白で円を描画する。背景が白色なので白色で円を描画することで消すことになる。

/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    dx = 15.0;        /* 移動量 */
    xx = 0.0;
    yy = 350.0;
    while(xx < (float)width){
        GWsetpen(0, 1, 1, -1);    /* ペン黒色 */
        GWellipse(xx, yy, xx + rr, yy + rr);

        GWsleep(100);        /* 時間待ち(100ms) */

        GWsetpen(19, 1, 1, -1);    /* ペン白色 */
        GWellipse(xx, yy, xx + rr, yy + rr);

        xx = xx + dx;        /* 移動量計算 */
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
int GWsleep(int ミリ秒);
指定した時間だけ処理を停止する。



▼課題1 〔mvball13.c〕
 ボールをGWウィンドウの右端から左端へ水平移動させるプログラムを作成せよ。


▼課題2 〔mvball14.c〕
 ボールをGWウィンドウの上端から下端へ垂直移動させるプログラムを作成せよ。



▼課題3 〔mvball15.c〕
 ボールをGWウィンドウの下端から上端へ垂直移動させるプログラムを作成せよ。


※ 考察 ※
 ボールの移動スピードはGWsleep関数による時間待ちの時間によって決まる。時間待ちの時間を短くすればスピードは()なり、時間を長くすればスピードは()なる。
 もう一つ、ボールの移動スピードを変える値がある。それが何か考えてみよう。


◆サンプルプログラム 〔mvball16.c〕
 ボールを斜めに移動させる。GWウィンドウの左下から右上に移動させる。
 X座標だけを変化させると水平方向、Y座標だけを変化させると垂直方向に移動する。斜めに移動させるにはXとY座標の両方を変化させる。

/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    dx = 15.0;        /* 移動量 */
    xx = 0.0;
    yy = 0.0;
    while(yy < (float)height){
        GWsetpen(0, 1, 1, -1);    /* ペン黒色 */
        GWellipse(xx, yy, xx + rr, yy + rr);
        GWsleep(100);        /* 時間待ち(100ms) */
        GWsetpen(19, 1, 1, -1);    /* ペン白色 */
        GWellipse(xx, yy, xx + rr, yy + rr);
        xx = xx + dx;        /* 移動量計算 */
        yy = yy + dx;
    }
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */

 XとY座標の移動量はともに変数dx(=15)としているので、ボールは右上45度に移動する。
 三角関数を利用すればいろいろな角度で移動させることができる。
 三角形の斜辺rの長さ分を移動させるときのxとyの大きさは次の式で求められる。

x = r × cosθ
y = r × sinθ

 C言語で三角関数(sin, cos)などの数学関数を利用するときは、ヘッダファイルmath.hをインクルードする必要がある。また、角度はラジアンで指定する。次の式で角度をラジアンに変換する。

ラジアン = 角度 * π / 180   (180度 = πrad)


 前へ 次へ 
 Copyright © 2005 Hiroshi Masuda 

 

 

inserted by FC2 system