トップページ > 記事閲覧
キーおしっぱなしによる連続入力を防ぎたい
名前:初心者です 日時: 2023/09/14 17:10

ゲームプログラミングの館に書かれていたようにmain.cppとcppファイル、hファイルをわけてゲームをつくっています。量が多いため一部抜粋させていただきます。 以下の内容はmainではないcppファイルに記述したものです。 int flag_key[2];を用意して(使いたいところが2か所あります)、下記の処理に関数を組み込みました。 void draw(){  if (flag_key[0] == 0) {//おしっぱなしによる連続入力を防ぐ if (CheckHitKey(Key.A) == 1) flag_key[0]++; if (CheckHitKey(Key.Start) == 1)flag_key[0]++; if (CheckHitKey(Key.B) == 1)flag_key[0]++; } else { if (CheckHitKey(Key.A) != 1 && CheckHitKey(Key.Start) != 1 && CheckHitKey(Key.B) != 1)flag_key[0] = 0; } } という関数をつくりました CheckHitKeyにあるKey.○○は、あとでキーを一括で変えられるように、また別のhファイルに書いた以下のような構造体をつくり struct MyStruct { int Up, Down, Left, Right, A, B, X, Y, Start, Select; }; 下記のように別のcppファイルで代入しています。 void default_key(){ Key.Up = KEY_INPUT_UP, Key.Down = KEY_INPUT_DOWN, Key.Left = KEY_INPUT_LEFT, Key.Right = KEY_INPUT_RIGHT, Key.A = KEY_INPUT_Z, Key.B = KEY_INPUT_X, Key.X = KEY_INPUT_A, Key.Y = KEY_INPUT_S, Key.Start = KEY_INPUT_RETURN, Key.Select = KEY_INPUT_SPACE; } 長くなりましたが質問は:上記の関数を組み込んだのにも関わらず、キーをおしっぱなしにすると連続で入力されてしまいます。どこを改善すればおしっぱなしによる連続入力を防げるでしょうか。 以下:他の情報を記しておきます if (flag_key[1] == 0) { if (CheckHitKey(Key.Right) == 1)flag_key[1]++; if (CheckHitKey(Key.Left) == 1)flag_key[1]++; } else { if (CheckHitKey(Key.Right) != 1 && CheckHitKey(Key.Left) != 1)flag_key[1] = 0; } という関数も使うので組み込んだところ、目的通りキーを離さないと次の入力ができないようになっていました。 DrawFormatString関数で確認したところ、特定のキーを押している間flag_key[0]は1を示しましたし、離すと0に変化しました。(if (flag_key[0] == 0)が正しく判定できていない?) ゲームプログラミングの館で紹介されていた、key[256]を用意し、main関数にwhile(gpUpdatekey()==0)というのをいれてみましたが、それでも変わらず長押しでフレームが変化するごとに入力されてしまいました。 以上です。長くなってしまい、すみませんでした。 もし皆様を不快にさせてしまったら申し訳ございません。 なにとぞよろしくお願いします。
メンテ

Page: 1 |

Re: キーおしっぱなしによる連続入力を防ぎたい ( No.1 )
名前:たろう 日時:2023/09/14 18:18

初心者ですさんこんにちは、 そのまま動くように書いてみましたが、 つまり一瞬だけ1が表示されるようにしたいという事でしょうか? 「目的通りキーを離さないと次の入力ができないように」ともあるので・・・ #include "DxLib.h" struct MyStruct { int Up, Down, Left, Right, A, B, X, Y, Start, Select; }; MyStruct Key; int flag_key[10]={0}; void default_key(){ Key.Up = KEY_INPUT_UP, Key.Down = KEY_INPUT_DOWN, Key.Left = KEY_INPUT_LEFT, Key.Right = KEY_INPUT_RIGHT, Key.A = KEY_INPUT_Z, Key.B = KEY_INPUT_X, Key.X = KEY_INPUT_A, Key.Y = KEY_INPUT_S, Key.Start = KEY_INPUT_RETURN, Key.Select = KEY_INPUT_SPACE; } void draw() { if (flag_key[0] == 0) {//おしっぱなしによる連続入力を防ぐ if (CheckHitKey(Key.A) == 1) flag_key[0]++; if (CheckHitKey(Key.Start) == 1)flag_key[0]++; if (CheckHitKey(Key.B) == 1)flag_key[0]++; } else { if (CheckHitKey(Key.A) != 1 && CheckHitKey(Key.Start) != 1 && CheckHitKey(Key.B) != 1)flag_key[0] = 0; } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { default_key(); ChangeWindowMode( TRUE ) ; DxLib_Init(); SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; draw(); DrawFormatString( 0,0, GetColor(255,255,255),"(%d)",flag_key[0] ) ; ScreenFlip() ; } DxLib_End() ; return -1 ; }
メンテ
Re: キーおしっぱなしによる連続入力を防ぎたい ( No.2 )
名前:初心者です(解決済み) 日時:2023/09/15 14:32

たろうさん。ご回答ありがとうございます。 そうですね、1と表示されている間はキーボードを押しても反応しないようにさせたいです。 ファイルをひとつにまとめると正しく動くのでしょうか。そしたらどうしてファイルをわけたままでも右左の関数は動いているのでしょうか キーの関数->config.cpp 連続入力を防ぐ関数->start.cpp WINAPI WinMain->main.cpp に記述しています。 語彙力がなくてうまく説明できず、皆様に迷惑がかかってしまうのであきらめることにしました。 わざわざ質問を立てておいて自分勝手ですみません。 たろうさん、こんな自分にお付き合いいただきありがとうございました。
メンテ
Re: キーおしっぱなしによる連続入力を防ぎたい ( No.3 )
名前:たろう(解決) 日時:2023/09/15 16:41

初心者さん、お気遣いありがとうございます。 「1と表示されている間はキーボードを押しても反応しないように」 ということは結果的に1が一瞬だけ表示されるようにするのと同じなので 例えば下の様に変数(flag[10])を一つ挟めばよいと思います。 「ファイルをひとつにまとめると正しく動くのでしょうか」 との事ですが、そうではなくて単純にdraw()に問題があるので、 うまく動かないだけと思いますm(__)m #include "DxLib.h" struct MyStruct { int Up, Down, Left, Right, A, B, X, Y, Start, Select; }; MyStruct Key; int flag_key[2]={0}; void default_key(){ Key.Up = KEY_INPUT_UP, Key.Down = KEY_INPUT_DOWN, Key.Left = KEY_INPUT_LEFT, Key.Right = KEY_INPUT_RIGHT, Key.A = KEY_INPUT_Z, Key.B = KEY_INPUT_X, Key.X = KEY_INPUT_A, Key.Y = KEY_INPUT_S, Key.Start = KEY_INPUT_RETURN, Key.Select = KEY_INPUT_SPACE; } void draw() { flag_key[0]=0; static int flag[10]={0}; if(CheckHitKey(Key.A) == 1){flag[0]++;}else{flag[0]=0;} if(CheckHitKey(Key.B) == 1){flag[1]++;}else{flag[1]=0;} if(flag[0]==1){flag_key[0]++;} if(flag[1]==1){flag_key[0]++;} } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { default_key(); ChangeWindowMode( TRUE ) ; DxLib_Init(); SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; draw(); DrawFormatString( 0,0, GetColor(255,255,255),"(%d)",flag_key[0] ) ; ScreenFlip() ; } DxLib_End() ; return -1 ; }
メンテ
Re: キーおしっぱなしによる連続入力を防ぎたい ( No.4 )
名前:初心者です(解決済み) 日時:2023/09/15 23:37

たろうさん、 私側から突き離しておきながらもお付き合いいただき誠にありがとうございます。 たろうさんの助言を参考に手を加えたところ、目的通りの挙動になりました。 おかげさまでモチベーションが回復しております。 本件は本当にありがとうございました。また機会がありましたらぜひよろしくお願いいたします。
メンテ

Page: 1 |

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

   クッキー保存