今までは、プログラムがすぐに終わってしまわないように、WaitKey関数 を使っていました。しかしこれではどのキーが押されても終了してしまっていました。
今回は、特定のキーの入力状態を監視する関数を学び、「Escキーが押されたら終了する」という処理に変更してみましょう。
当然 DXライブラリは特定のキーの入力状態をチェック出来ます。
全てのキーの監視の仕方は後の章で説明するとして、まずは Escキー が押されているかどうかをチェックしてみましょう。
特定のキーの入力状態をチェックするには CheckHitKey関数 を使います。CheckHitKey 関数のリファレンスを確認 してみましょう。
宣言 | int CheckHitKey( int KeyCode ) ; |
概略 | 特定キーの入力状態を得る |
引数 | KeyCode : 入力状態を取得するキーコード |
戻り値 | 1:押されている |
0:押されていない |
入力状態を確認したいキーのキーコードを引数に渡すと、そのキーが押されていれば 1 が、押されていなければ 0 が返ってくるので、
これを見てキーの入力状態を確認することが出来ます。どのキーがどのキーコードに対応しているかは、上のリファレンスでご確認下さい。
Escキー は 「KEY_INPUT_ESCAPE」です。
WaitKey関数 の代わりに CheckHitKey関数 を用いて、「Escキーが押されていれば終了する」ようにするには
while( 1 ){
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){
break;
}
}
このようにグルグル回り続けながら何度もキーの入力状態をチェックし、Escキーが押されていればループを抜ければ良さそうです。
すなわち Escキー が押されたら while文 を抜ける仕組みになっています。
ちなみに while(1) は無限ループを意味します。どこかでbreak文を通るまで無限にループし続けます。
上の理屈で Waitkey関数 を置き換えてみましょう。
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode( TRUE ); // ウィンドウモードに設定 DxLib_Init(); // DXライブラリ初期化処理 int Handle; Handle = LoadGraph( "画像/キャラクタ00.png" ); DrawGraph( 50, 100, Handle, TRUE ); while( 1 ){ if( CheckHitKey(KEY_INPUT_ESCAPE) == 1 ){ break; } } DxLib_End() ; // DXライブラリ終了処理 return 0 ; }
どうでしょう。うまくいきましたか?
「あれ、画面がフリーズしたぞ!?」
そんな人もいるかもしれません。これは環境によるので、結果は異なるかもしれませんが、正常に描画出来なかったり画面が「応答なし」になったりしたかもしれません。
それは、このプログラムがWindows内で孤立しているからです。
孤立ってどういうこと??
と思われた方、Windowsというシステムを考えて下さい。
プログラムは一人で動いているわけではありません。Windows内にある大変多くのプログラムの中で、他と連絡を取りながらうまく共存しているのです。
プログラムが他と連絡を取らずに一人好き勝手やるとどうなるか・・。
先ほどのようにフリーズして「応答なし」のような現象が起きます。
この「他とうまく連絡を取る」という処理はなかなか面倒なのですが、これもまたDXライブラリの便利さが際立つところで
「ProcessMessage」とだけ書けば中で全部うまいこと他と連絡を取ってくれます。
実は WaitKey関数 がうまく動いていたのは、この関数の中で何度も ProcessMessage関数 が呼び出されていたからなのです。
特定の場所でループする時は、定期的に ProcessMessage関数 を呼ばなくてはなりません。
今回 ProcessMessage関数 という新しい関数を紹介しましたが、特に詳しくは説明しません。ただループ内で呼び出せばいいだけだからです。
では先ほどのプログラムのループ内にこの関数を入れてみましょう。
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode( TRUE ); // ウィンドウモードに設定 DxLib_Init(); // DXライブラリ初期化処理 int Handle; Handle = LoadGraph( "画像/キャラクタ00.png" ); DrawGraph( 50, 100, Handle, TRUE ); while( 1 ){ ProcessMessage(); if( CheckHitKey(KEY_INPUT_ESCAPE) == 1 ){ break; } } DxLib_End() ; // DXライブラリ終了処理 return 0 ; }
実行結果
無事フリーズすることなく表示できたと思います。
このように、ProcessMessage関数 は常に呼び出す必要があるのです。
但し、本サイトでは、Escキーが押されたら終了するのではなく、ウィンドウの×ボタンが押されたら終了するようにします。
と言っても処理は簡単です。
ウィンドウの×ボタンが押されると ProcessMessage関数 が0以外を返すので、
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode( TRUE ); // ウィンドウモードに設定 DxLib_Init(); // DXライブラリ初期化処理 int Handle; Handle = LoadGraph( "画像/キャラクタ00.png" ); DrawGraph( 50, 100, Handle, TRUE ); while( 1 ){ if( ProcessMessage() != 0 ){ break; } } DxLib_End() ; // DXライブラリ終了処理 return 0 ; }
このように変更すればよいだけです。
これでEscを押して終了させる方法と、×ボタンを押して終了させる方法がお分かり頂けたと思います。
ちなみに、×ボタンを押さなくても Alt + F4 でも終了出来ます。
- Remical Soft -