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




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



1.マウスカーソル位置の取得

マウスカーソルの位置を取得するには、gl_gemousepos()関数を使用します。 マウスカーソルの(X,Y)座標がパラメータで指定した変数に格納され返されます。 パラメータ変数に値を返すのでポインタとして指定します。

gl_getmousepos(long *px, long *py);
px : マウスカーソルのX座標が返されます。
py : マウスカーソルのY座標が返されます。
long型へのポインタなので注意してください。

返り値が1の場合、マウスカーソルがウィンドウ内にあり、ウィンドウが前面に表示されています。
それ以外の場合は、0が返されます。

例)
long px, py;
gl_getmousepos(&px, &py);
マウスカーソルの位置が変数px、pyにセットされます。

いつものボールが表示されるプログラムを改造して、マウス位置にボールが移動するプログラムを作成します。 gl_getmousepos()関数が返すマウスカーソルの位置をボールの位置用の変数(b_xx,b_yy)に代入すれば、マウスカーソルの移動にあわせてボールが動くようになります。

#include <graph.h>

main()
{
        HBITMAP hbmp_ball;
        int     b_xx, b_yy, bold_xx, bold_yy, rc;
        long    xx, yy;
        unsigned long
                tick;

        gl_openwin(-1, -1, 640, 480, 0);

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

        bold_xx = bold_yy = -1;
        b_xx = 320;
        b_yy = 240;
        tick = GetTickCount();

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

                if(gl_getkeystate(VK_ESCAPE) < 0)
                        break;

                //マウスカーソルの位置を取得する。
                if(gl_getmousepos(&xx, &yy)){
                        //long型へのポインタなので一旦別の変数xx,yyで取得し
                        //b_xx,b_yyへ代入する。
                        b_xx = xx;
                        b_yy = yy;

                        //ボールがウィンドウからはみ出さないためのチェック
                        if(b_xx < 0)
                                b_xx = 0;
                        if(b_xx > 640 - 16)
                                b_xx = 640 - 16;
                        if(b_yy < 0)
                                b_yy = 0;
                        if(b_yy > 480 - 16)
                                b_yy = 480 - 16;
                }

                if(bold_xx != b_xx || bold_yy != b_yy){
                        if(bold_xx != -1 && bold_yy != -1){
                                gl_fillrect(bold_xx, bold_yy, bold_xx + 16, bold_yy + 16, RGB(0, 0, 0));
                        }
                        bold_xx = b_xx;
                        bold_yy = b_yy;
                        gl_drawbitmap(hbmp_ball, b_xx, b_yy, 16, 16, 0, 0);
                }
                gl_refresh();
        }
}