グラフィックについて

こちらでは画像の描画に関する代表的な関数について説明する。まずは以下のソースコードを見ていただきたい。

#include <DxLib.h>
#define PI 3.1415926535897932384626433832795f

int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
    ChangeWindowMode( TRUE );//非全画面にセット
    SetGraphMode( 800 , 600 , 32 );//画面サイズ指定
    SetOutApplicationLogValidFlag( FALSE ) ;//Log.txtを生成しないように設定
    if(DxLib_Init() == 1){return -1;}//初期化に失敗時にエラーを吐かせて終了

    //
    //ここで敵やプレイヤーのオブジェクトの実体を作る
    //
    int graph[3];
    graph[0] = LoadGraph("background.png");
    graph[1] = LoadGraph("char01.png");
    graph[2] = LoadGraph("char02.png");

    int count = 0;

    while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
        ClearDrawScreen();//裏画面消す
        SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に

        count++;

        DrawGraph(0, 0, graph[0], TRUE);
        DrawRotaGraph(400, 300, 0.5, PI / 180 * (count % 360), graph[1], TRUE);
        DrawRotaGraph2(200, 300, 20, 20, 1.0, PI / 180 * (count % 360), graph[1], TRUE);
        DrawRotaGraph3(600, 300, 100, 100, 1.0, 3.0, 0, graph[1], TRUE);

        ScreenFlip();//裏画面を表画面にコピー
    }

    DxLib_End();
    return 0;
}

LoadGraph( char *FileName);

こちらで描画したい画像を読み込む。宣言は以下のようにして行う。

int 変数名 = LoadGraph("画像名.png");

プロジェクトフォルダの中にそれと同名のフォルダがもう一つ存在するので、そちらに上記で名前を指定した画像を入れる。
だが、複数の画像をフォルダに入れる場合、それらを1つのフォルダにまとめたいだろう。
その場合は、上記と同じ場所に画像の入ったフォルダを用意して以下のように書く。

int 変数名 = LoadGraph("フォルダ名\\画像名.png");

DrawGraph(int x, int y, int GrHandle, int TransFlag);

x、yには画像を描画したい座標を入れ、GrHandleにはLoadGraphで読み込んだ描画したい画像の変数名を入れる。
TransFlagにTRUEを入れると表示する画像の透過色が有効となり、FALSEを入れると無効になる。
だが、この関数は指定した座標に画像の左上(0,0)が来るように描画するため、キャラクタなどの描画には向かない(2点間の距離を用いてキャラクタ同士の当たり判定を求める際に、画像の左上がその基準点となってしまうため)。

DrawRotaGraph(int x, int y, double ExtRate, double Angle, int GrHandle, int TransFlag, int TurnFlag);

DrawGraphとは異なり、指定した座標に画像の中央が来るように描画される。
ExRateは画像の拡大率、Angleは画像の描画角度(ラジアン)を指定することができる。
TurnFlagでは画像の反転表示を行うかを指定することができる(TRUEで反転。FALSEで通常通り)。省略可能で、その場合は自動でFALSEとなる。
ExRateやAngleの所に変数を入れ、その数値を変動させることによって画像の拡大縮小や回転が行える。
また、試作段階で画像のサイズが決まらない時には拡大率を変えることで一時的にサイズを変えられるため、サイズに応じて画像を何枚も用意する手間が省ける。

DrawRotaGraph2(int x, int y, int cx, int cy, double ExtRate, double Angle, int GrHandle, int TransFlag, int TurnFlag);

cx、cyで画像の中心座標を指定できる。
x = 320,、y = 240、 cx = 32,、cy =0の場合、画面の(320,240)に画像の(32,0)が重なるように描画される。

DrawRotaGraph3(int x, int y, int cx, int cy, double ExtRateX, double ExtRateY, double Angle, int GrHandle, int TransFlag, int TurnFlag);

画像を描画する際の拡大率を縦横個別に指定できる。
ExtRateXで横、ExtRateYで縦の拡大率を設定可能。画像を縦長、横長にする際に使おう。

画像は後から描画したもの(ソースコードで下の方にあるもの)が手前に表示される。アクションなどではキャラ同士が重なることも珍しくないので、描画の順番についても考えるべきであろう。

その他

他にも、1枚の画像を分割して読み込むLoadDivGraph()や画像の描画時に加算合成や透過処理が行えるSetDrawBlendMode()などがグラフィック関連の主な関数として挙げられる。