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




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



1.テキストの描画

説明画面やゲームの得点表示など、ウィンドウ内に文字を描画する用途は多数あります。 今回はゲーム用のウィンドウ上に文字を描画する方法を説明します。

printf()関数では、文字をゲーム用のウィンドウに表示することができません。 Study C本体のウィンドウに表示されてしまいます(デバッグ用にprintfを使えるので便利です)。

ゲーム用のウィンドウ上に文字を表示するには、gl_textout()関数を使用します。 この関数は指定するパラメータが多いですが、しばらくは描画する文字列と文字列の位置(X,Y座標)、大きさ、色だけを指定して使うことにします。

gl_textout("MSゴシック", 大きさ, 0, 0, X座標, Y座標, 文字列, 表示色, RGB(0,0,0), 0);
・大きさはポイント単位(を10倍した値)で指定します。
 ポイントの説明はここでは省略するので90前後の大きさで色々試してみてください。
・表示色は、gl_fillrect()関数で説明したようにRGB(...)で指定します。

次のプログラムは、文字列の大きさに90、135、180を指定(色も変えてます)している例です。

#include <graph.h>

main()
{
        gl_openwin(-1, -1, 640, 480, 0);
        gl_textout("MSゴシック", 90, 0, 0, 10, 50, "テストabc", RGB(255,255,255), RGB(0,0,0), 0);
        gl_textout("MSゴシック", 135, 0, 0, 10, 100, "テスト123", RGB(255,0,255), RGB(0,0,0), 0);
        gl_textout("MSゴシック", 180, 0, 0, 10, 150, "テストABC", RGB(0,255,255), RGB(0,0,0), 0);
        gl_refresh();
}


2.ゲームスコアの描画

gl_textout()関数でゲームの得点などを描画する場合、桁が変わると前に描画した文字が残ってしまう場合があるので注意する必要があります。 次のプログラムを実行してみたください。 9999と表示後にEnterキーを押すと100ではなく1009と表示されているように見えると思います。

#include <graph.h>

main()
{
        char    buff[100];
        int     score;

        gl_openwin(-1, -1, 640, 480, 0);
        score = 9999;
        sprintf(buff, "%d", score);
        gl_textout("MSゴシック", 100, 0, 0, 10, 50, buff, RGB(255,255,255), RGB(0,0,0), 0);
        getchar();
        score = 100;
        sprintf(buff, "%d", score);
        gl_textout("MSゴシック", 100, 0, 0, 10, 50, buff, RGB(255,255,255), RGB(0,0,0), 0);
        gl_refresh();
}

これを避けるためには、gl_fillrect()関数で描画したエリアを消去してしまう方法があります。 しかし、表示する最大桁数が決まっていれば次のようにsprintfの書式指定で回避することもできます(前に表示した所へ空白文字を描画することになります)。

#include <graph.h>

main()
{
        char    buff[100];
        int     score;

        gl_openwin(-1, -1, 640, 480, 0);
        score = 9999;
        sprintf(buff, "%4d", score);
        gl_textout("MSゴシック", 100, 0, 0, 10, 50, buff, RGB(255,255,255), RGB(0,0,0), 0);
        getchar();
        score = 100;
        sprintf(buff, "%4d", score);
        gl_textout("MSゴシック", 100, 0, 0, 10, 50, buff, RGB(255,255,255), RGB(0,0,0), 0);
        gl_refresh();
}