トップページ > 記事閲覧
GetHitKeyStateAllとMakeKeyInput
名前:ティス 日時: 2017/03/14 01:18

はじめまして。 GetHitKeyStateAllとMakeKeyInput系の併用時の挙動について教えてください。 新・ゲームプログラミングの館様の 「全てのキーの入力状態を見て、押されているキーコードのキーフレーム数を加算」 (dixq.net/g/02_09.html)のコードを使用し、以下のようにプログラムを組んだのですが、 入力中(何か文字を入れた直後)から、tmpKeyの112番目と148番目のキーが押しっぱなしになってしまいます。 キーが入力されたらSetMouseDispFlagをfalseに、マウスが動いたらtrueになるようにしたいので、困っております。 何か解決方法はございますでしょうか。 よろしくお願いいたします。(以下コード) #include "DxLib.h" typedef struct { int x; int y; }POS; POS Mouse; // マウスの座標 POS oldMouse; // 前フレームのマウスの座標 int key[256]; // キーの入力状況 int UpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i<256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら key[i]++; // 加算 SetMouseDispFlag(false); } else { // 押されていなければ key[i] = 0; // 0にする } } return 0; } void MouseCheck() { oldMouse = Mouse; // 前フレームのマウス座標を保存 GetMousePoint(&Mouse.x, &Mouse.y); // マウス座標を取得 if (oldMouse.x != Mouse.x || oldMouse.y != Mouse.y) // 異なっていたら { SetMouseDispFlag(true); // カーソルを表示する } } // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* --------------------------------------------- * * 起動設定 * * -----------------------------------------------*/ ChangeWindowMode(TRUE); // ウィンドウモードに設定 SetGraphMode(800, 600, 32); // 画面モード設定 if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定 /* --------------------------------------------- * * メインループ * * -----------------------------------------------*/ char String[256]; int InputHandle; // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); // 作成したキー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0) //裏画面を表画面に反映, メッセージ処理, 画面クリア,キー入力状況 { // マウスが動いたかどうか MouseCheck(); if (CheckKeyInput(InputHandle) != 0) { // 入力が終わったら // 入力された文字列を取得 GetKeyInputString(String, InputHandle); // 用済みのインプットハンドルを削除する DeleteKeyInput(InputHandle); break; } else { // 入力途中の文字列を描画 DrawKeyInputString(0, 0, InputHandle); } } while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0) //裏画面を表画面に反映, メッセージ処理, 画面クリア,キー入力状況 { // マウスが動いたかどうか MouseCheck(); DrawString(0, 0, "あなたが入力した文字列は", GetColor(255, 255, 255)); DrawString(0, 16, String, GetColor(255, 255, 255)); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: GetHitKeyStateAllとMakeKeyInput ( No.1 )
名前:管理人 日時:2017/03/15 14:07

日本語入力モードになると112番目( カタカナひらがなキー )と148番目( 半角/全角キー )のキーが 押されっぱなしになるのはOSの仕様なので『何かキーが押されているか』の判定で除外していただくしかありません なので、 for (int i = 0; i<256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら key[i]++; // 加算 SetMouseDispFlag(false); } else { // 押されていなければ key[i] = 0; // 0にする } } こちらを for (int i = 0; i<256; i++) { if( i == 112 || i == 148 ) { continue; } if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら key[i]++; // 加算 SetMouseDispFlag(false); } else { // 押されていなければ key[i] = 0; // 0にする } } このようにしてみてください
メンテ
Re: GetHitKeyStateAllとMakeKeyInput ( No.2 )
名前:ティス(解決) 日時:2017/03/16 23:34

なるほど、そういった仕様だったのですね。 他の場面で使用する予定もないキーですので、そのように対処させていただきます。 調べても解決できなかったのでとても助かりました。 お忙しい中、素早いご返信ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存