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




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



1.壁で反射するボール

左から右へ流れるだけの前回のプログラムを改造して左右の壁でボールが反射するようにします。 ボールが壁にぶつかるのは、X座標(変数b_xxの値)が0の時と640-16(16はボールのサイズ)の時です。 ボールがこの位置に来たときにif文で移動方向を変えれば、ボールは反射するようになります。 移動方向(移動量)を保持するための変数bd_xxを新たに用意します。この値が正の場合はボールが右に移動し、負の場合は左に移動します。

#include <graph.h>

main()
{
        HBITMAP hbmp_ball;
        int     b_xx = 0,
                bd_xx = 10;     //移動量を保持する変数
        unsigned long
                tick;

        hbmp_ball = gl_loadbitmap("ball.bmp");
        if(hbmp_ball == NULL){
                printf("ビットマップファイルが見つかりません.\n");
                exit(0);
        }
        gl_openwin(-1, -1, 640, 480, 0);


        tick = GetTickCount();
        for( ; ; ){
                if(GetTickCount() < tick + 50)
                        continue;
                tick = GetTickCount();

                gl_fillrect(b_xx, 240, b_xx + 16, 240 + 16, RGB(0, 0, 0));

                //移動量をボールのX座標に加えボールを移動させます。
                b_xx += bd_xx;

                //ボールが左の壁か右の壁にぶつかったときにこのif文で移動量を
                // 10 → -10 または -10 → 10に変化させます。
                if(b_xx >= 640-16 || b_xx <= 0){
                        bd_xx = -bd_xx;
                }

                //ボールがはみ出さないようにするための処理。
                if(b_xx < 0){
                        b_xx = 0;
                }
                if(b_xx > 640-16){
                        b_xx = 640-16;
                }
                gl_drawbitmap(hbmp_ball, b_xx, 240, 16, 16, 0, 0);
                gl_refresh();
        }
}


2.上下左右の壁で反射するボール

前のプログラムは左右方向の反射だけを行いましたが、これと同じことを上下方向にも適応すればよいわけです。 当然、横方向に使用した変数b_xx、bd_xxの縦方向用変数(b_yy、bd_yy)が必要になります。 また、if文も横用と縦用に分かれます。

#include <graph.h>

main()
{
        HBITMAP hbmp_ball;
        int     b_xx = 0, bd_xx = 10,
                b_yy = 0, bd_yy = 10;
        unsigned long
                tick;

        hbmp_ball = gl_loadbitmap("ball.bmp");
        if(hbmp_ball == NULL){
                printf("ビットマップファイルが見つかりません.\n");
                exit(0);
        }
        gl_openwin(-1, -1, 640, 480, 0);


        tick = GetTickCount();
        for( ; ; ){
                if(GetTickCount() < tick + 50)
                        continue;
                tick = GetTickCount();

                gl_fillrect(b_xx, b_yy, b_xx + 16, b_yy + 16, RGB(0, 0, 0));

                //横方向の処理
                b_xx += bd_xx;
                if(b_xx >= 640-16 || b_xx <= 0){
                        bd_xx = -bd_xx;
                }
                if(b_xx < 0){
                        b_xx = 0;
                }
                if(b_xx > 640-16){
                        b_xx = 640-16;
                }

                //縦方向の処理
                b_yy += bd_yy;
                if(b_yy >= 480-16 || b_yy <= 0){
                        bd_yy = -bd_yy;
                }
                if(b_yy < 0){
                        b_yy = 0;
                }
                if(b_yy > 480-16){
                        b_yy = 480-16;
                }
                gl_drawbitmap(hbmp_ball, b_xx, b_yy, 16, 16, 0, 0);
                gl_refresh();
        }
}

縦横ともに座標が変化するので、このプログラムはボールが斜めに移動するようになります。