無料でネットを楽しもう無料ゲームプレイレポート無料C++総合環境DirectXゲームプログラミング初心者C++ホームページ作成のコツゲーム質問掲示板ゲームリンク

無料C++










6.描画(表示)位置の補正 と定数
キャラ(画像)を画面の中央に表示するプログラム(C++サンプルプログラムソース)
#include "DxLib.h"
//定数
#define PLAYER_SIZE 50
#define PLAYER_SIZE_HALF PLAYER_SIZE/2

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
     {
     // DXライブラリの設定
     // SetOutApplicationLogValidFlag(TRUE);
     // SetGraphMode(640,480,16);
     // ChangeWindowMode( TRUE ) ;
     if( DxLib_Init()==-1) return-1;
     SetMouseDispFlag( TRUE ) ;
     SetDrawScreen(DX_SCREEN_BACK);
     //変数の宣言と初期化
     int player_position_x=320;
     int player_position_y=240;

     int player_graph=LoadGraph("Player.png");
     //メインループ
     while(ProcessMessage()==FALSE)
     {
         //キャラの描画
         ClsDrawScreen() ;
        
DrawGraph(player_position_x-PLAYER_SIZE_HALF,
         player_position_y-PLAYER_SIZE_HALF, player_graph,TRUE);

         ScreenFlip();
         // ESCキーが押されたらループから抜ける
         if(CheckHitKey(KEY_INPUT_ESCAPE)==TRUE)break;
     }
     //終了処理
     DxLib_End();
     return 0;
}
DXライブラリの設定  流し読みゾーン 詳しくはDXライブラリ
// DXライブラリの設定
// SetOutApplicationLogValidFlag(TRUE);
// SetGraphMode(640,480,16);
// ChangeWindowMode( TRUE ) ;
if( DxLib_Init()==-1) return-1;
//SetMouseDispFlag( TRUE ) ;
SetDrawScreen(DX_SCREEN_BACK);


//の後ろは、コンパイラから無視されます。
書かなくてもいのですが、//を消すだけで、そのソースが有効になります。
SetOutApplicationLogValidFlag(FALSE);
動作環境のログを残すか残さないかを決めます。

SetGraphMode(640,480,16);
画面の大きさと使える色の設定。上では、16色ではなく16ビットカラーです。

ChangeWindowMode( TRUE ) ;
ウインドウモードかフルスクリーンモードかを決めます。

SetMouseDispFlag( TRUE ) ;
マウスカーソルを表示するかを決めます。

メインループテンプレート while()  
変数の宣言と初期化 は、
//変数の宣言と初期化
の後にでも追加していきましょう。

アルゴリズム(プログラム)は黄色の字 の部分に書き足していきます。
//メインループ
while(ProcessMessage()==FALSE)
{
     //ここにプログラムを書く
     // ESCキーが押されたらループから抜ける
     if(CheckHitKey(KEY_INPUT_ESCAPE)==TRUE)break;
}


大まかにはこんな感じです。

あとは、「#」です。プリプロセッサといいます。
プリプロセッサ は、プログラムと思うより、
コンパイラへの命令 だと考えれば理解しやすいでしょう。

#include は、
使うライブラリをコンパイラに教えます。今のところ"DxLib.h"だけです。
新しく、他のライブラリを使う場合、追加していきます。

#define  は、
指定された文字列がプログラム上に出てきたら、
その文字を設定された数字に置き換えなさい、と命令します。


他にも、プリプロセッサはたくさんあります。
絶対に覚えなければいけない事ではないのですが、使えると非常に便利です。
定数
定数はどれでしょう?。
ソースに出てくる、50や320や-1などの 数字はすべて定数 です。
他にも定数があるのですが解りますか?。

じつは、「 TRUE 」も「 FALSE 」も「 DX_SCREEN_BACK 」も「 PLAYER_SIZE_HALF 」も
「 KEY_INPUT_ESCAPE 」もすべて定数です。
大文字で、単語の間に「_」(半角アンダーライン)が書かれているものは、すべて定数なのです。
「 TRUE 」と「 FALSE 」は、コンパイラで最初から設定されている定数です。
TRUE の意味は、真実で、コンパイル時に数字の1に置き換えられます。
FALSE の意味は、誤りで、コンパイル時に数字の0に置き換えられます。

ChangeWindowMode( 1 ) ; だと、()の中にどんなパラメータを入れればいいかわかりません。 しかし、ChangeWindowMode(TRUE ) ; と書かれていれば、ON( TRUE )かOFF( FALSE )かの選択だとわかります。便利ですね。

KEY_INPUT_ESCAPE 」などは、DXライブラリで宣言してくれている定数です。
キーコードが入ってるのですが、キーコードを気にせず使うことが出来ます。
例えば KEY_INPUT_ESCAPE のキーコードが21だったとします。
if(CheckHitKey(21)==TRUE)break; だと、見ただけではどのキーのことかわかりません。
KEY_INPUT_ESCAPE だと、見てすぐ「ESCキー入力コード」だとわかります。便利ですね。

他人のソースで、大文字を「_」で区切っている物が定数だとわかると、
いちだんとソースが読みやすくなります。

前のページの変数と、今回の定数の書き方を知っていれば、格段に読みやすくなります。
定数を文字に置き換えるとどれだけ便利かはわかってもらえたと思います。

注意
定数は変数ではないので「 PLAYER_SIZE_HALF =32;」のように、 数字を代入できません 。代入されているのではなく、コンパイルの途中で置き換えられているのです。
ですから、プログラム実行中には PLAYER_SIZE_HALF という定数自体がありません。

自分で定数を文字化する

自分で、定数を文字化できるともっと便利です。

#define PLAYER_SIZE 50

#define [区切り] [定数名] [区切り] [パラメータ]

[区切り]
区切りに、ENTERが使えません。

[定数名]
大文字の単語を「_」(アンダーバー)で区切ることが推奨されています。

[区切り]
上と同じ

[パラメータ]
数字・文字・文字列・宣言されている定数を使った式 など

注意
変数でも文章でもありません。
ソース中に定数名があればパラメータに置き換えろと宣言(命令)しているのです。
これは、プログラム実行中に置き換えられるのではなく、コンパイル中に置き換えられます。


変数ではないのですから、代入はできません。代入演算子(=)は使えません。
文章でもないのですから、「;」(文の終了記号)などは必要ありません。


プレイヤーの画像サイズは50だと決まっているので定数にします。
プログラム中で変更できないので、安全性がアップします。

すべてプログラムを書き終えたとき、
ゲームバランス的にもっとサイズを小さくしたほうがいいと思うこともあるかもしれません。
その時、
#define PLAYER_SIZE 32
と変更するだけで、ソース中すべてのプレーヤーサイズを32に変えることが出来ます。

実際の座標と描画(表示)する座標を合わせる
横(X)320・縦(Y)240にプレイヤーを表示しても、真ん中に表示されません。
なぜでしょうか?。
下のように、「ここ」に表示されるからです。
このままだと、「ここ」から弾が発射されたり、
「ここ」に当たり判定ができたり、変なことになります。

「ここ」を中心に表示するには、X座標(320-画像サイズ/2)・Y座標(240-画像サイズ/2)と書かないといけません。
そこで、
#define PLAYER_SIZE        50
#define PLAYER_SIZE_HALF    PLAYER_SIZE/2

と宣言します。すると、
DrawGraph(player_position_x-PLAYER_SIZE_HALF, player_position_y-PLAYER_SIZE_HALF, player_graph,TRUE);
となります。

ホームページへ
このページのトップへ