40b. 「マウスがどれ位押されたか」を判定する関数

一つ上の40a章のマウス版です。マウスも、キー同様に今の瞬間押されたか、押されてからどれ位たっているかを確認したい場合があります。
マウスを使ったゲームを作る場合はいつもこの関数を呼んであげましょう。

上のフォーマットに習ってGetHitMouseStateAll_2関数の仕様を書いてみます。

この関数には、独自に定義したMouse_t型が必要なので、関数を宣言する前にこの定義を一緒に書いてあげて下さい。

宣言 int GetHitMouseStateAll_2( Mouse_t *Nezumi ) ;

概略 マウスの最大8種類のキー押下状態を取得し、それぞれがどれ位押されたかを観測する。座標データやホイールの回転数も一緒に取得してくれる。

引数 Mouse_t *Nezumi : マウスの押下・入力状態を格納するバッファのポインタ

戻り値 0 : 成功
-1 : 失敗

解説
 
typedef struct{
    int x;
    int y;          //座標
    int WheelRotVol;//ホイールの回転量
    unsigned int Button[8];  //ボタンの押した状態
}Mouse_t;
で定義した構造体の中身にそれぞれの入力状態が入ります。

x,yには普通に座標が入ります。マウスボタンの割り当ては

Button[0]は左クリック、[1]は右クリック、[2]は中央ホイール押さえこみが普通です。

マウスによっては戻る、進むなどのボタンが[3]〜[7]に割り振られます。

ご自分のマウスでどのような割り振りになっているかは実際にサンプルを使って確かめてみて下さい。

抑えている間カウントアップするので、例えば左クリックが押された瞬間かどうかは

.Button[0]==1 かどうかで確かめられます。

マウスの回転量は下に下げる方向がマイナスです。

前にこの関数を呼んでから回った回転数が入ります。

サンプル

各マウスボタンを押したカウント数、ホイール回転数、マウスポインタのある座標が表示されます。


#include "DxLib.h"
 
typedef struct{
    int x;
    int y;          //座標
    int WheelRotVol;//ホイールの回転量
    unsigned int Button[8];  //ボタンの押した状態
}Mouse_t;
Mouse_t Mouse;
 
int GetHitMouseStateAll_2(Mouse_t *Nezumi){
    if(GetMousePoint( &Nezumi->x, &Nezumi->y ) == -1){ //マウスの位置取得
        return -1;
    }
    int MouseInput=GetMouseInput();    //マウスの押した状態取得
    for(int i=0; i<8; i++){            //マウスのキーは最大8個まで確認出来る
        if( (MouseInput & 1<<i ) != 0 ) Nezumi->Button[i]++;   //押されていたらカウントアップ
        else                            Nezumi->Button[i] = 0; //押されてなかったら0
    }
    Nezumi->WheelRotVol = GetMouseWheelRotVol() ;    //ホイール回転量取得
    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;//初期化と裏画面化
    SetMouseDispFlag( TRUE ) ;//マウス表示オン
    int White = GetColor(255,255,255);
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
          //↑メッセージ処理          ↑画面をクリア        ↑ESCが押されていない
        GetHitMouseStateAll_2(&Mouse);  //マウスの入力状態取得
 
        DrawFormatString(0,0,White,"座標[%d,%d],回転量:%d,",Mouse.x,Mouse.y,Mouse.WheelRotVol);
 
        for(int i=0; i<8; i++){
            DrawFormatString(0, 20+20*i, White, "ボタン%d:%u", i, Mouse.Button[i]);
        }
 
        ScreenFlip();
    }
    DxLib_End();
    return 0;
}

実行結果



→掲示板で質問する



- Remical Soft -