質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
C++

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

解決済

キーを押した時だけを判定する方法

samidare_chan
samidare_chan

総合スコア278

C++

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

2回答

0リアクション

0クリップ

499閲覧

投稿2022/08/15 04:01

編集2022/08/15 04:32

提示コードですがelse if(key == KEY_RIGHT)つまり右キーを押した瞬間だけを取得したのですがbool型変数を使って判定処理を記述してもなぜか毎フレーム走ってしまいます。これはなぜでしょうか?
キー入力は押している間if文の中が実行されます。

確認したいと

プロジェクト全体で別の場所で同じ関数が実行されていないあ確認
変数の型を確認
キーを押している間if文の中が通るという処理を確認 getch()関数の挙動を確認

debug.log
3 ああああ 3 ああああ 3 ああああ 3 ああああ 3 ああああ 3 ああああ 3 ああああ 3 ああああ
Main.cpp

cpp

#include <iostream> #include "Screen.hpp" #include <memory> //#include <Magick++.h> #include "../lib/src/Console.hpp" int main() { Console::Init(); Console::Init_ErrorLog("log/error.log"); Console::Init_Log("log/log.log"); nodelay(stdscr,true); Console::RenderBuffer(NULL); std::unique_ptr<Screen> main = std::make_unique<Screen>(); while(true) { Console::ClearBuffer(stdscr); main->Loop(); if (main->getExit() == true) { break; } Console::RenderBuffer(stdscr); } Console::Finalize(); return 0; }
利用部

cpp

void Screen::Update() { //pull.Update(); if(Console::GetKeyDown() == Console::KeyCode::Right) { Console::Debug::WriteLog("ああああ\n"); } // KeyInput(); }
Input.hpp

cpp

#ifndef ___IPNUT_HPP___ #define ___IPNUT_HPP___ #include "Data.hpp" namespace Console { class Input { public: static void InputKey(); static KeyCode GetKeyCode(); static KeyCode GetKeyDown(); static void ResetKey(); private: static KeyCode keyInput; static KeyCode prevKeyInput; static bool flag; Input(); ~Input(); }; }; #endif
Input.cpp

cpp

#include "Input.hpp" #include <ncurses.h> #include "Debug.hpp" Console::KeyCode Console::Input::keyInput = Console::KeyCode::None; Console::KeyCode Console::Input::prevKeyInput = Console::KeyCode::None; bool Console::Input::flag = false; Console::KeyCode Console::Input::GetKeyCode() { return keyInput; } Console::KeyCode Console::Input::GetKeyDown() { if(flag == true) { flag = false; Debug::WriteLog(" %d\n",keyInput); return keyInput; } else { return KeyCode::None; } } void Console::Input::InputKey() { int key = getch(); if(key == KEY_UP) { keyInput = KeyCode::Up; } else if(key == KEY_RIGHT) { keyInput = KeyCode::Right; if(keyInput != prevKeyInput) { flag = true; } } else if(key == KEY_DOWN) { keyInput = KeyCode::Down; } else if(key == KEY_LEFT) { keyInput = KeyCode::Left; } else if(key == KEY_ESC) { keyInput = KeyCode::Escape; } else if(key == KEY_RETURN) { keyInput = KeyCode::Return; } else { flag = false; keyInput = KeyCode::None; prevKeyInput = KeyCode::None; } prevKeyInput = keyInput; } void Console::Input::ResetKey() { //keyInput = KeyCode::None; }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/15 08:12

こちらの質問が他のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

2022/08/15 05:13

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

2022/08/15 04:55

こちらの質問が他のユーザーから「プログラミングに関係のない質問」という指摘を受けました。

yominet

2022/08/15 05:26

InputKey()を呼び出す箇所が提示されていないので私の妄想の域をでないことを前提です #なんか怪しい箇所があるが InputKey()が、質問者さんの脳内で想定している以上に呼ばれていて flagがfalseに戻されているのは? まずは flag = false; にブレイクポイントでも置くか(ブレイク機能をもつ環境かどうかわからないけど)、ログを書き出す処理を加えて 通過していないか確認してみてはいかがでしょうか?

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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