ホームへ戻る

 1.5章 特定のキーの入力状態を監視する

 今までは、プログラムがすぐに終わってしまわないように、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 -