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

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

新規登録して質問してみよう
ただいま回答率
86.12%
GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

解決済

[GLFW] glfwSetKeyCallback()関数を使ってキーが押された瞬間を検出したい。

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

2回答

0リアクション

0クリップ

2199閲覧

投稿2020/09/21 13:27

編集2021/04/19 11:30

提示コードの///コメント部内の部のコードですがglfwSetKeyCallback();イベント処理関数を使ってキーが押された瞬間1と返す方法が知りたいです。提示画像ですが提示コードのように実装したのですがなぜか1という値が数フレーム返って来てしまいます。本来押された瞬間であれば1は一回だけで後は2の値が来るはずなのですがログを見ると数フレーム来てしまっています。これは何が原因なのでしょうか?

参考サイト: https://www.glfw.org/docs/latest/group__input.html#ga1caf18159767e761185e49a3be019f8d

イメージ説明

cpp

//#define GLEW_STATIC //スタティックリンク #include <iostream> #include <fstream> #include <cstdlib> #include <vector> #include <glew/include/GL/glew.h> #include <glfw/include/GLFW/glfw3.h> #include "Window.hpp" #include "Shape.hpp" #include "Shader.hpp" Object::Vertex rectangleVertex[4] = { {-0.5f,-0.5f}, {0.5f,-0.5f}, {0.5f,0.5f}, {-0.5f,0.5f} }; int main() { if (glfwInit() == GL_FALSE) { std::cerr << "glfw初期化失敗。" << std::endl; return -1; } atexit(glfwTerminate); //プログラム終了時の処理を登録 Window window; //OpenGL Verison 3.2 Core Profile を選択する glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,2); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); Shape* shape = new Shape(2, 4, rectangleVertex); Shader shader("Test.vert","Test.frag"); shader.setBindAttribVertex(0, "Position"); shader.setBindAttribFragment(0, "fragment"); glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 while (window) { glClear(GL_COLOR_BUFFER_BIT); //カラーバッファをクリア shader.Active(); printf(": %d\n", window.getKeyInput(GLFW_KEY_SPACE)); window.SwapBuffers(); //ダブルバッファリング } }

cpp

#include "Window.hpp" //コンストラクタ Window::Window(int width, int height, const char* title) :window(glfwCreateWindow(width, height, title, NULL, NULL)), wheel(0) { std::fill(std::begin(keyStatus),std::end(keyStatus),0); if (window == NULL) { std::cerr << "ウインドウ生成失敗" << std::endl; exit(1); } glfwMakeContextCurrent(window); //コンテキストを作成 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cerr << "GLFW 初期化失敗" << std::endl; exit(1); } atexit(glfwTerminate); //プログラム終了時の処理を登録 glfwSwapInterval(1); //垂直同期 //イベント処理 glfwSetWindowUserPointer(window, this); //このインスタンスのthis glfwSetWindowSizeCallback(window, Resize); //ウインドウサイズを変更する時に呼び出す処理 glfwSetScrollCallback(window,Wheel); //マウスホイール操作時に呼び出す処理 ////////////////////////////////////////////////////////////////////////////////////////////// glfwSetKeyCallback(window, KeyBoard); //キー入力時に呼び出す処理 ////////////////////////////////////////////////////////////////////////////////////////////// Resize(window, width, height); } //サイズ変更 void Window::Resize(GLFWwindow* const win, int width, int height) { int fbWidth, fbHeight; glfwGetFramebufferSize(win, &fbWidth, &fbHeight); glViewport(0, 0, fbWidth, fbHeight); Window* const instance = (Window*)glfwGetWindowUserPointer(win); if (instance != NULL) { instance->size.x = (GLfloat)width; instance->size.y = (GLfloat)height; } } //ウインドウサイズを取得 const glm::vec2 Window::getSize() const { return size; } //キー入力を取得 const int Window::getKeyInput(int key)const { return keyStatus[key]; } //マウスホイール void Window::Wheel(GLFWwindow* win, double x, double y) { Window* const instance = (Window*)glfwGetWindowUserPointer(win); if (instance != NULL) { instance->wheel += (GLfloat)y; } } ///////////////////////////////////////////////////////////////////////////////////////////////// //キー入力 void Window::KeyBoard(GLFWwindow* win, int key, int scancode, int action, int mods) { Window* const instance = (Window*)glfwGetWindowUserPointer(win); if (instance != NULL) { instance->keyStatus[key] = action; } } //////////////////////////////////////////////////////////////////////////////////////////////// //bool 演算子 Window::operator bool() { glfwPollEvents(); //イベントを取り出す //ウインドウを閉じる必要があれば false if (glfwWindowShouldClose(window) != 0) { return false; } else { return true; } } //ダブルバッファリング void Window::SwapBuffers()const { glfwSwapBuffers(window); } //デストラクタ Window::~Window() { glfwDestroyWindow(window); }

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

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

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

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

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

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

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

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

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

2021/04/20 01:36

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

退会済みユーザー

退会済みユーザー

2021/04/19 11:38

文章を修正しました。

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

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

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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