キー入力処理を行うGetHitKeyStateAll_2という関数を先ほどサンプルから取ってきてペタっと貼りましたね。

先ほどのままではKeyという関数をグローバル変数にしなければなりませんが、

どこでも値が書き換わってしまうグローバル変数はなるべく少なくしたいものです。

そこで同じグローバル変数でも、なるべくバグ発生の確率が下がるような使い方を試みてみます。



--key.cpp変更--

#include "../include/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}

int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}



mainファイルとは別のkeyファイルに上記のように書いてみます。

今まではエスケープボタンの入力状態はKey[KEY_INPUT_ESCAPE]を調べる必要がありました。

しかし、そのKeyであるstateKeyは他から参照しないようにして、CheckStateKey関数にそのキー番号を渡して

入力状態を返すようにすれば、キー情報の値が不正に書き換えられる危険性が減らせます。

今度からは上で実装したCheckStateKey関数にキー番号を渡して、キーの入力状態をチェックするようにしましょう。

また、他のファイルで実装した変数や関数を利用する時はextern宣言というものを使います。


//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);


これをmain.cppの上に書くことでmainファイル内でkeyファイルで定義した関数が使えるようになります。

また、前の節で書いたメインループは毎回書く処理を一つにProcessLoop()という関数にまとめて整理しました。

行ってる事は変わっていません。では変更したmainファイルを見てみます。



--main.cpp変更--

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);

//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessLoop()==0){//メインループ

        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}



Escボタンを押したら終了すれば完成です。

- Remical Soft -