次の解説に進む前に、DXライブラリプログラミングをより深く理解するために、1つの疑問を解消しておきたい。

pg7-1
 多分、ここまでの解説を順番に読み進めていって頂いた方なら、もうこのSyokika関数の上記のコードの意味は、何となく理解出来ていると思います。「何となく」という言葉を使っているのは、それなりの意味があります。

P_rogo = LoadGraph("img\\P_rogo.png");
 つまり、このコードは、「ああ、これはP_rogo変数にP_rogo.pngという画像を代入しているのだね」と。

P_rogo = 0;
 では、このように書いてみることにしました。このコードであれば、P_rogo変数に0の値を代入しています。これは何ら難しいことではなく、C言語及びC++の基本的な命令の代入です。ですが、その上のコードの場合は、実際は、P_rogo変数にP_rogo.pngという画像を代入しているわけではありません。

リターン2
 ここで以前解説した、returnとは の解説を振り返って頂きたいのですが。実は、returnの解説を先にしていたのは、この解説をするために先読みして解説していたわけなのですが。C++プログラミングで関数を使用、もしくは作成した場合、何もしなくても、その関数の中には、returnという空の容器が入っています。そして、このreturnは、その関数で行われたプログラムの結果、最終的な答えを入れる容器です。

pg7-1
 つまり、このコードは、正しくは、LoadGraph関数を呼び出し、様々なプログラムがその中で行われ、その最終的な答えをLoadGraph関数のreturnに入れて、それをP_rogo変数に入れていることになります。では、そのLoadGraph関数の中で行われたプログラムの最終的な答え(return)とは、一体、何なのか?というと、メモリに読み込んだP_rogo.pngの連絡先です。携帯番号のようなものです(笑)。

pg7-2
 そして、メモリに読み込んだ画像を表示する時は、このようにDrawGraph関数を使って、P_rogo.pngに連絡して呼び出しています。

「DrawGraph:あ、もしもし。P_rogo.pngさんですね。こっち来てくれますか?」
「P_rogo.png:オッケー!」

 てな感じです(笑)。では、そのp_rogo.pngの画像本体は、メモリ内のどこにどのようにして保管されているのか?ちょっと気になりませんか?それを知るには、「DxLib.h」を見てみる必要があります。

pg7-3
 はい。ということで「DxLib.h」で見つけてきました。あれ?ここに大量に書かれている型に似たようなものをどこかで見たことないですか?はい、そうですね。我々が作った「Header.h」の内容に少し似ています。

pg7-4
 これですね。つまり、DXライブラリ側でも大量のグローバル変数を使ってるということですね。C++プログラムでもグローバル変数は普通に使います。「C++プログラムはグローバル変数を使わない」は、謝った知識です。そのようなバカな知識は捨てましょう。必要であれば、C++プログラムでもグローバル変数は使うのです。C++は、C言語とC++の両方の機能を使うことができ、どっちを使うのかはプログラマーの自由です。目的は果たすには、どっちの機能を使えば楽なのかだけを考え、カッコいいとかカッコ悪いとか、そういう判断で、無理にC++の命令(Classとか)だけを使うのはあまりにも幼稚な考え方です。プレイヤーは、ゲームをプレイしてもプログラムコードなんて見ません。プレイヤーにとってはそんなことはどうでもいいことです。無論、プログラマーにとってもどうでもいいことです。プログラムにカッコいいという判断基準は無用の長物です。だた、それを使うことで処理速度が増したり、プロジェクト全体で見た時に、分かり易いコードになるからという判断は別です。まあ、それはいいのですが。上の「DxLib.h」のLoadGraph関数の続きを見てみます。

pg7-5
 長いので2列に分割しました。LoadGraph関数の中には、さらに引数が入っています。

LoadGraph(const TCHAR *FileName, int NotUse3DFlag = FALSE ) ;
 最初の「const TCHAR *FileName,」という引数は、画像ファイルからファイル名や画像情報などを抜き取っています。つまり、今回の場合は、「P_rogo.png」を取得しています。そして、後ろの「int NotUse3DFlag = FALSE 」という引数は、int型の関数としてNotUse3DFlagで、画像ファイルからグラフィックハンドルを作成しています。なんだか難しい言い回しですが、要するにメモリに取り込んだ画像ファイルの連絡先(携帯番号のようなもの)を作っています。

pg7-1
 その画像の連絡先をLoadGraph関数のreturnの容器に代入して、それをP_rogo変数に代入しています。LoadGraph関数のプログラム本体は、また別の場所にあります。もっと細かく説明すると、画像の色情報を取得したり、画像の1ドット単位の色を表示させる場所なども取得しているのですが、そこまで突き詰めると難しくなるので、とりあえず、今は、「グラフィックハンドル(画像の連絡先)」を作成して、それをP_rogo変数に代入している。というところまで理解しておくだけで十分です。

pg7-6
 ところで、そのグラフィックハンドル(連絡先)とやらを見てみたくないですか?というわけで、グラフィックハンドルを見てみることにします。プロジェクトロゴ画像の表示コード以外の画像表示コードをコメントにして、アニメーションコードも全てコメントにし、上記のコードを書いてみました。

DrawFormatString( 20 , 20 , Cr ,"P_rogo変数の値は、%d です。", P_rogo);
 これは、DXライブラリのDrawFormatString関数を使っています。DrawString関数は、単にコードに書いた文字列を表示させるだけの関数ですが、DrawFormatString関数は、変数の値を表示させることも出来ます。

DrawFormatString( x座標 , y座標 , 文字の色 ,"表示させる文字 %dは整数 %fは小数点", 変数名);
 DrawFormatString関数は、このように指定して使用します。表示させる変数は最後に書き、%d を書いたところに、その変数の値を表示させるのですが、%d を書いた場合は、整数で表示され、%f を書いた場合は、小数点で表示されます。%f は、flart型の値を表示させる時に使います。では、これで一旦、ビルドしてみます。

pg7-7
 こういう実行結果になりました。つまり、このプロジェクトロゴ画像のグラフィックハンドル(連絡先)は、「68943897」です。つまり、LoadGraph関数は、この番号に電話を掛けて、この画像を呼び出しているのです。
※ 「連絡先、携帯番号、電話を掛ける」という表現は、分かり易く解説するための表現です。

pg7-7
 一旦、プログラムを終了させて、もう一度、ビルドしてみました。やはりこの画像のグラフィックハンドルは同じのようです。

pg7-8
 だったら、このようにグラフィックハンドル(番号)で指定しても同じ結果になるように思えませんか?

pg7-7
 結果は、グラフィックハンドルを直接指定しても同じように画像が表示されました。これで、何となく関数とreturnの関係がご理解いただけたでしょうか。

pg7-10
 通常、DXライブラリの関数リファレンスを見に行くと、どの関数もこのような説明をされていますが、これで戻り値の意味がご理解いただけたかと思います。