はじめまして。
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; // ソフトの終了
}