🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3436閲覧

キーが押された瞬間だけを判定したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/12/18 12:16

提示コードの////コメント部ですがどうすればキーが押された瞬間だけtruenにして後はfalseを返す処理を作れるのでしょうか?
色々試しましたがどうしてもわかりません。

cpp

1#include "stdio.h" 2#include "stdlib.h" 3#include <Windows.h> 4#include "stdio.h" 5#include "stdlib.h" 6 7 8#include "DrawCharactor.hpp" 9 10 11#include "KeyInput.hpp" 12 13// ウインドウサイズ 14#define MAX_WIDTH ((int)100) 15#define MAX_HEIGHT ((int)40) 16 17FILE* fp = NULL; 18 19 20int main() 21{ 22 fopen_s(&fp,"Mian.txt","w"); 23 DrawCharactor* dc = new DrawCharactor(); 24 KeyInput* key = new KeyInput(); 25 26 27 28 int y = 0; 29 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 while (true) 31 { 32 key->getKey(); 33 34 35 if (key->getKeyDown(KeyCode::UP_KEY) == true) 36 { 37 y--; 38 fprintf(fp, "UP\n"); 39 40 } 41 else if (key->getKeyDown(KeyCode::DOWN_KEY) == true) 42 { 43 fprintf(fp,"Down\n"); 44 y++; 45 } 46 // fprintf(fp, "Down\n"); 47 48 49 for (int i = 0; i < 5; i++) 50 { 51 if (y == i) 52 { 53 dc->setDraw("-> "); 54 dc->setDraw_Line("AAAA"); 55 56 } 57 else 58 { 59 dc->setDraw_Line("AAAA"); 60 } 61 } 62 63 64 65 66 67 68 dc->GenerateOutput(); 69 70 key->ResetKey(); 71 } 72 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 73 74 delete dc; 75 delete key; 76 77 78 fclose(fp); 79 80 81 82 return 0; 83}

cpp

1#ifndef ___KEYINPUT_HPP_ 2#define ___KEYINPUT_HPP_ 3#include <iostream> 4#include "stdlib.h" 5#include "stdio.h" 6 7#include <Windows.h> 8 9 10 11class KeyInput 12{ 13public: 14 15 16 KeyInput(); //コンストラクタ 17 ~KeyInput(); //デストラクタ 18 19 bool getKeyDown(enum class KeyCode key); //キーが押された時 (瞬間だけ) 20 bool getKeyHoldDown(); //キーが押されてる間 21 void getKey(); 22 void ResetKey(); 23 24private: 25 26 bool misPush[255] = { false }; //どのキーが押されているか? 27 bool misHoldPush[255] = { false }; //押されているキー 28 29 30 31 32 33 HANDLE handle; 34 INPUT_RECORD Buffer; 35 DWORD Length; 36 DWORD lpNumber; 37 38 DWORD mPushkey; //押されたキーを管理 39 40 41 42 FILE* fp = NULL; //デバッグログ 43 44}; 45 46 47// キーコード 48enum class KeyCode 49{ 50 51 A_KEY = 0x41, 52 B_KEY = 0x43, 53 C_KEY = 0x44, 54 D_KEY = 0x45, 55 E_KEY = 0x46, 56 F_KEY = 0x47, 57 G_KEY = 0x48, 58 H_KEY = 0x49, 59 I_KEY = 0x4A, 60 J_KEY = 0x4B, 61 K_KEY = 0x4C, 62 L_KEY = 0x4D, 63 M_KEY = 0x4E, 64 N_KEY = 0x4F, 65 O_KEY = 0x50, 66 P_KEY = 0x51, 67 Q_KEY = 0x52, 68 R_KEY = 0x53, 69 S_KEY = 0x54, 70 T_KEY = 0x55, 71 U_KEY = 0x56, 72 V_KEY = 0x57, 73 W_KEY = 0x58, 74 X_KEY = 0x59, 75 Y_KEY = 0x5A, 76 Z_KEY = 0x5A, 77 78 LEFT_KEY = 0x25, //左矢印キー 79 UP_KEY = 0x26, //上矢印キー 80 RIGHT_KEY = 0x27, //右矢印キー 81 DOWN_KEY = 0x28, //下矢印キー 82 SPACE_KEY = 0x20, //スペースキー 83 84 85}; 86 87#endif

cpp

1#include "KeyInput.hpp" 2#include "conio.h" 3KeyInput::KeyInput() 4{ 5 handle = GetStdHandle(STD_INPUT_HANDLE); 6 7 Length = 1; 8 lpNumber = 0; 9 10 fopen_s(&fp,"KeyInput.txt","w"); 11 12 13} 14 15void KeyInput::getKey() 16{ 17 if (ReadConsoleInput(handle, &Buffer, 1, &lpNumber) != 0) 18 { 19 // if (Buffer.Event.KeyEvent.bKeyDown == true) { 20 mPushkey = Buffer.Event.KeyEvent.wVirtualKeyCode; 21 misPush[(int)mPushkey] = true; 22 23 fprintf(fp, "mPushkey %d\n", (int)mPushkey); 24 25 //fprintf(fp, "ああああkey %d\n", (int)mPushkey); 26 // } 27 } 28} 29 30 31/////////////////////////////////////////////////////////////////////////////////////////////////////////// 32// キーが押された瞬間だけ 33bool KeyInput::getKeyDown(KeyCode key) { 34 35 // fprintf(fp, "key %d\n", (int)key); 36 // fprintf(fp, "mPushkey %d\n", (int)mPushkey); 37 38 39 if ( (misPush[(int)key] == true) && (misHoldPush[(int)key] == false) ) 40 { 41 misHoldPush[(int)key] = true; 42 return true; 43 } 44 else if ( (misPush[(int)key] == false) && (misHoldPush[(int)key] == true) ) 45 { 46 fprintf(fp, "いいいい \n"); 47 48 misHoldPush[(int)key] = false; 49 return false; 50 } 51 return false; 52} 53///////////////////////////////////////////////////////////////////////////////////////////////////////// 54 55void KeyInput::ResetKey() 56{ 57 for (int i = 0; i < 255; i++) 58 { 59 misPush[(int)i] = false; 60 61 } 62 63} 64 65bool KeyInput::getKeyHoldDown() 66{ 67 return false; 68} 69 70 71KeyInput::~KeyInput() 72{ 73 fclose(fp); 74} 75 76

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでしょうか?
このようにフラグを変更することで成り立ちます。
今回はUP_KEYのみです。後はご自身で考えて制作して下さい。

static bool down_flag = false; static bool up_flag = true; //起動時にバグらなくする為の対応 if (key->getKeyDown(KeyCode::UP_KEY) == true) { up_flag = false; if(down_flag == false){ down_flag = true; return 3;//押された瞬間の数値(仮) } return 1;//押している間の数値(仮) } down_flag = false; if(up_flag == false){ up_flag = true; return 2;//離された瞬間の数値(仮) } return 0;//離している間の数値(仮)

投稿2020/12/21 07:04

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問