トップページ > 記事閲覧
【不具合?】条件によりGetHitKeyStateAllが異常動作する
名前:was-blue.0793 日時: 2025/04/12 23:13

いつもお世話になっております。 最新版のVer. 3.24fにおいて、一部条件でGetHitKeyStateAll関数・GetHitKeyStateAll関数が異常動作する不具合がありました。 「SetUseDirectInputFlag」「SetKeyboardNotDirectInputFlag」を明示的に指定した状態によっては、 GetHitKeyStateAll関数を使用した際にキーを入力して離しても離した処理が発生しない(「0」に戻らない・マイナス方向へのカウントが始まらない)動作になります。 以下は条件を再現させる簡易コードです。 初期化処理 --- // 全体でのDirectInput使用・不使用を明示的に指定する // (1,2) = (true, false) のみ発生せず、それ以外は不具合が発生する SetUseDirectInputFlag(TRUE); // (1) SetKeyboardNotDirectInputFlag(TRUE); // (2) DxLib_Init(); --- 実際の動作処理: --- // 以下はループの処理のみ、ループの外側で「char keydata[256];」「int x;」「int y;」が定義されているとする GetHitKeyStateAll(keydata); if (keydata[KEY_INPUT_LEFT]) x--; if (keydata[KEY_INPUT_RIGHT]) x++; if (keydata[KEY_INPUT_DOWN]) y--; if (keydata[KEY_INPUT_UP]) y++; // 不具合が発生している場合、1回でもキーを押した方向にずっと動いていく。左と右を押したと判断されていると、左右には動かなくなる DrawBox(x, y, x + 10, y + 10, GetColor(255,255,255), TRUE); --- それではよろしくお願いします。
メンテ

Page: 1 |

Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.1 )
名前:管理人 日時:2025/04/13 03:42

手元の環境で SetUseDirectInputFlag(TRUE); SetKeyboardNotDirectInputFlag(TRUE); の設定を使用した 以下のようなテストプログラム( GetHitKeyStateAll で取得できる値を画面に表示するプログラム )を 実行してみましたが、一度押したキーがキーを離しても 1 のままになるということはありませんでした #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char KeyBuffer[ 256 ] ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DirectInput を使用する指定をする SetUseDirectInputFlag( TRUE ) ; SetKeyboardNotDirectInputFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; memset( KeyBuffer, 0, sizeof( KeyBuffer ) ) ; GetHitKeyStateAll( KeyBuffer ) ; int i, j ; for( i = 0 ; i < 16 ; i ++ ) { DrawFormatString( 32, 64 + i * 16, GetColor( 255,255,255 ), "%X", i ) ; for( j = 0 ; j < 16 ; j ++ ) { if( i == 0 ) { DrawFormatString( 64 + j * 16, 32 + i * 16, GetColor( 255,255,255 ), "%X", j ) ; } DrawFormatString( 64 + j * 16, 64 + i * 16, GetColor( 255,255,255 ), "%s", KeyBuffer[ j + i * 16 ] ? "1" : "0" ) ; } } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } was-blue.0793さんの環境では上記のプログラムでもキーを離しても 1 のままになってしまうか よろしければお試し頂けないでしょうか m(_ _)m
メンテ
Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.2 )
名前:was-blue.0793 日時:2025/04/13 16:59

>> 管理人 様 お待たせしております。 こちらのプログラムでは異常動作しないことが確認されました。 サンプルプログラムと当方のプロジェクトとを比較したところ、当方のプロジェクトでだけ異常動作が発生するようです。 実際のコードでは更に設定関数を使用していたりするため、この2つ以外の設定関数が影響している可能性がありそうです。 お手数ではございますが、当方のプロジェクトを管理人様の環境で動作させても異常動作が発生するか確認してもらうことは可能でしょうか? (当方の環境では、2つの環境で異常動作することを確認しています) それではよろしくお願いします。
メンテ
Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.3 )
名前:管理人 日時:2025/04/14 03:20

> お手数ではございますが、当方のプロジェクトを管理人様の環境で動作させても異常動作が発生するか確認してもらうことは可能でしょうか? はい、可能です 2つのプロジェクトを圧縮した容量の合計が 20MB 以下でしたらこちらのメールアドレスに添付してお送りください BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) 20MB以上でしたらお手数で申し訳ありませんが Googleドライブやアップローダーなどを利用してください m(_ _)m
メンテ
Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.4 )
名前:was-blue.0793 日時:2025/04/16 23:26

>> 管理人様 お待たせしております。 当該不具合が発生するプロジェクトファイルを送信しました。 連絡は引き続きこちらのスレッドでお願いします。 それではよろしくお願いします。
メンテ
Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.5 )
名前:管理人 日時:2025/04/18 03:24

メールありがとうございます 添付していただいたプロジェクトで現象を確認できました 少し調べてみたのですが原因は分かりませんでした 少し時間をかけて調べる必要がありそうですので、申し訳ありませんが数日程お時間をください m(_ _)m
メンテ
Re: 【不具合?】条件によりGetHitKeyStateAllが異常動作する ( No.6 )
名前:管理人 日時:2025/04/19 02:04

お待たせしました 本件の現象が発生する条件は 『SetKeyboardNotDirectInputFlag( true ); を使用した状態で SetSysCommandOffFlag( true ); も使用する』 でした この条件を満たしてもキーの押下状態が 1 のままにならないように修正しましたので、 よろしければこちらの修正版をお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存