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




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_getkeystate()関数を使用したプログラムを上下方向にも移動できるように改造してみます(また、ESCキーを押すとプログラムが終了する処理も追加します)。

改造は、X軸方向の処理と同じことをY軸方向に付いても行えば良いだけです。

#include <graph.h>

main()
{
        HBITMAP hbmp_ball;
        int     b_xx, b_yy, bold_xx, bold_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();

                //ESCキーを押したらプログラムが終了する処理も追加
                if(gl_getkeystate(VK_ESCAPE) < 0)
                        break;

                if(gl_getkeystate(VK_LEFT) < 0){
                        b_xx -= 10;
                        if(b_xx < 0)
                                b_xx = 0;
                }
                if(gl_getkeystate(VK_RIGHT) < 0){
                        b_xx += 10;
                        if(b_xx > 640 - 16)
                                b_xx = 640 - 16;
                }

                //カーソルの上下キーが押されているときの処理を追加
                if(gl_getkeystate(VK_UP) < 0){
                        b_yy -= 10;
                        if(b_yy < 0)
                                b_yy = 0;
                }
                if(gl_getkeystate(VK_DOWN) < 0){
                        b_yy += 10;
                        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();
        }
}

このプログラムを実行して上下左右のカーソルキーを押してみてください。 上下左右方向にボールが動くと思います。ここで、上と左のカーソルキーを同時に押してみてください。 ボールが斜め方向に動くと思います。kbhit()、getch()関数の組み合わせではできなかった処理です。


2.マウスのボタン状態の取得

gl_getkeystate()関数はマウスボタンが押されているかどうかの状態も取得することができます。
マウスボタンの状態を取得するには、引数にVK_LBUTTON/VK_RBUTTONを指定します。 また、Shiftキーを押すとBEEP音を鳴らすという処理も加えました。

#include <graph.h>

main()
{
        HBITMAP hbmp_ball;
        int     b_xx, bold_xx;
        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 = -1;
        b_xx = 320;
        tick = GetTickCount();

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

                //左カーソルキーが押されていれば移動処理を行います。
                if(gl_getkeystate(VK_LBUTTON) < 0){
                        b_xx = b_xx - 10;
                        if(b_xx < 0)
                                b_xx = 0;
                }
                //右カーソルキーが押されていれば移動処理を行います。
                if(gl_getkeystate(VK_RBUTTON) < 0){
                        b_xx = b_xx + 10;
                        if(b_xx > 640 - 16)
                                b_xx = 640 - 16;
                }
                //Shiftキーが押されたらBEEP音を鳴らします。
                if(gl_getkeystate(VK_SHIFT) < 0){
                        MessageBeep(0);
                }

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