少し7章のプログラムを整理してみましょう。
while文を一周すると1フレームを表します。
while( 1 ){
メッセージ処理をする;
画面に描画した内容を消す;
画像を描画する;
裏画面に描いた内容を表画面に反映する;
}
このような順番で処理をしていました。
ここで、赤字部以外は毎回必ずしなければならない処理です。
毎回書かなければならない処理をいつも長々と書くのは面倒ですね。
本サイトではページの都合上短く書きたいことと、なるべくお決まりコードは目立たせたくない理由から
毎回書かなければならない部分を一行にまとめて記載します。
7章のプログラムを・・・
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode( TRUE ); // ウィンドウモードに設定 DxLib_Init(); // DXライブラリ初期化処理 SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定 int x = 0; int Handle; // 画像格納用ハンドル Handle = LoadGraph( "画像/キャラクタ01.png" ); // 画像のロード while( 1 ){ if( ProcessMessage() != 0 ){ // メッセージ処理 break;//ウィンドウの×ボタンが押されたらループを抜ける } ClearDrawScreen(); // 画面を消す DrawGraph( x, 100, Handle, TRUE ); //画像の描画 x = x + 2; // xを2増やす ScreenFlip(); //裏画面を表画面に反映 } DxLib_End(); // DXライブラリ終了処理 return 0; }
↓↓↓↓↓↓↓
下のように変更
↓↓↓↓↓↓↓
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定 int x = 0; int Handle; // 画像格納用ハンドル Handle = LoadGraph( "画像/キャラクタ01.png" ); // 画像のロード // while(裏画面を表画面に反映, メッセージ処理, 画面クリア) while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ DrawGraph( x, 100, Handle, TRUE ); //画像の描画 x = x + 2; // xを2増やす } DxLib_End(); // DXライブラリ終了処理 return 0; }
while の中で呼んでいる関数は共通してエラーが起きると0以外を返します。
ということは、これらの関数が0を返している間は処理をしていてよいということですから、このように書けます。
ちなみに、ウィンドウの×ボタンが押されると ProcessMessage関数 が0以外を返すので、ループを抜けます。
このように書くと、毎回必ず書かなければならない処理が大きく3つに分けられることがわかるでしょう。
初期化処理;
while( 1フレームに一度しなくてはならない処理 ){
}
終了処理;
の3つです。毎回書くコードは毎回確認する必要がありませんから、こうすることで、短く見やすくはなりました。
しかし、DxLibの初期化にあたる関数は全く返り値を見ていないので、エラーが起きようともほったらかしです。
本来であれば下のコードのように関数一つ一つ全て返り値が正常かどうかチェックし、異常なら終了するようにするのがベストです。
(0以外が返ってくると異常を示す。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
if( ChangeWindowMode(TRUE) != 0 ){
return 0;
}
if( DxLib_Init() != 0 ){
return 0;
}
if( SetDrawScreen( DX_SCREEN_BACK ) != 0 ){
DxLib_End();
return 0;
}
int x = 0;
int Handle; // 画像格納用ハンドル
Handle = LoadGraph( "画像/キャラクタ01.png" ); // 画像のロード
while( 1 ){
if( ScreenFlip() != 0 ){
break;
}
if( ProcessMessage() != 0 ){
break;
}
if( ClearDrawScreen() != 0 ){
break;
}
DrawGraph( x, 100, Handle, TRUE ); //画像の描画
x = x + 2; // xを2増やす
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
エラーが起きた時の対処はよくなったかもしれませんが、長くなってしまいサンプルをお見せするには非常によろしくないコードです。
それにエラーが生じることはほとんどありません。
ですから、本サイトでサンプルをお見せする時は、細かなエラー処理をしていない短いコードでお見せすることご了承下さい。
DXライブラリを勉強する段階では当面必要ないと思いますが、
ご自分でゲームを最終的にリリースする際は関数の戻り値を確認してエラー処理をするプログラムに変更して下さい。
- Remical Soft -