DXライブラリでキーボード版WM_LBUTONDOWNみたいな処理を実装する

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

DXライブラリでキーボード版WM_LBUTONDOWNみたいな処理を実装する

投稿記事 by taketoshi » 12年前

一つのキーボードボタンでメニュー画面を構築していると
操作的には一度しかボタンを押していないのに、入力は延々と受け付けられ
本来ならば、一段目、二段目、三段目とキーを押すたびに実行したい処理が
一段目から三段目までを一度押しただけで一気に実行されてしまう問題で悩んでいた。

様々なフラグを噛ませ無駄な処理を実装してきた。
本当に私は頭が固いと思う。

ボタンを一度押したら次はボタンが離されるまで処理を返さない関数を書いた。
本当に私は頭が固いと思う・・・・・・。
fe.png

CODE:

int InputCheck::Key[256];

//キーの状態を返却する
//引数:キーナンバー
int InputCheck::ReturnInputKey(int input){
	static int bInput;

    char tmpKey[256]; // 現在のキーの入力状態を格納する
    GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
    for( int i=0; i<256; i++ ){ 
            if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                    Key[i] = 1;     // 加算
            } else {              // 押されていなければ
					Key[i] = 0;   // 0にする
            }
    }

	//ボタンが離された押し下げフラグを解除する
	if(Key[input] == 0){
		bInput = 0;
	}

	//ボタンが押された一度目のみ1を返す
	if(Key[input] == 1 && bInput == 0){
		bInput = 1;
		return 1;
	}else{
		return 0;
	}
}
よーし、次だ次!!
最後に編集したユーザー taketoshi on 2013年4月19日(金) 23:45 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: DXライブラリでキーボード版WM_LBUTONDOWNみたいな処理を実装する

投稿記事 by みけCAT » 12年前

この関数にはバグがあります。
このコードを実行し、Aキーを押しっぱなしにすると、毎フレームa.wavが鳴ります。
さらにAキーを押したままBキーを押すと、Bキーを押している間a.wavの再生開始をやめるようです。
bInputを1個だけ使用するのではなく、キーの数(256)だけ要素を確保した配列にするべきです。

CODE:

#include "DxLib.h"

char Key[256];
int InputCheck_Key[256];
 
//キーの状態を返却する
//引数:キーナンバー
int InputCheck_ReturnInputKey(int input){
    static int bInput;
 
    char tmpKey[256]; // 現在のキーの入力状態を格納する
    GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
    for( int i=0; i<256; i++ ){ 
            if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                    Key[i] = 1;     // 加算
            } else {              // 押されていなければ
                    Key[i] = 0;   // 0にする
            }
    }
 
    //ボタンが離された押し下げフラグを解除する
    if(Key[input] == 0){
        bInput = 0;
    }
 
    //ボタンが押された一度目のみ1を返す
    if(Key[input] == 1 && bInput == 0){
        bInput = 1;
        return 1;
    }else{
        return 0;
    }
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) {
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
	SetDrawScreen( DX_SCREEN_BACK );        //裏画面に設定

	int sound_a=LoadSoundMem("a.wav");
	int sound_b=LoadSoundMem("b.wav");

	while(!ProcessMessage() && !ClearDrawScreen()) {
		//↑メッセージ処理         ↑画面をクリア

		//ココに処理を書いていく
		if(InputCheck_ReturnInputKey(KEY_INPUT_A)) {
			PlaySoundMem(sound_a,DX_PLAYTYPE_BACK,TRUE);
		}
		if(InputCheck_ReturnInputKey(KEY_INPUT_B)) {
			PlaySoundMem(sound_b,DX_PLAYTYPE_BACK,TRUE);
		}

		ScreenFlip();//裏画面を表画面に反映
	}

	DxLib_End();
	return 0;
}
↓このコードは著作権や利用規約の関係で使いたくないのですね、わかります。
http://dixq.net/rp/3.html

ISLe
記事: 2650
登録日時: 14年前

Re: DXライブラリでキーボード版WM_LBUTONDOWNみたいな処理を実装する

投稿記事 by ISLe » 12年前

最近質問掲示板に似た内容のスレがありましたね。
最後に編集したユーザー ISLe on 2013年4月20日(土) 17:31 [ 編集 1 回目 ]

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: DXライブラリでキーボード版WM_LBUTONDOWNみたいな処理を実装する

投稿記事 by taketoshi » 12年前

>>みけCATさん

アッーーーーーーーーーーーー!!!!!
やっちまったーーーー!!!!

>>ISLeさん

そうなんですよ。
頭固くてですねぇ・・・。