提示コードの///コメント部内の部のコードですがglfwSetKeyCallback();イベント処理関数を使ってキーが押された瞬間1と返す方法が知りたいです。提示画像ですが提示コードのように実装したのですがなぜか1という値が数フレーム返って来てしまいます。本来押された瞬間であれば1は一回だけで後は2の値が来るはずなのですがログを見ると数フレーム来てしまっています。これは何が原因なのでしょうか?
参考サイト: https://www.glfw.org/docs/latest/group__input.html#ga1caf18159767e761185e49a3be019f8d
cpp
1//#define GLEW_STATIC //スタティックリンク 2#include <iostream> 3#include <fstream> 4#include <cstdlib> 5#include <vector> 6#include <glew/include/GL/glew.h> 7#include <glfw/include/GLFW/glfw3.h> 8 9 10 11#include "Window.hpp" 12#include "Shape.hpp" 13#include "Shader.hpp" 14 15Object::Vertex rectangleVertex[4] = 16{ 17 {-0.5f,-0.5f}, 18 {0.5f,-0.5f}, 19 {0.5f,0.5f}, 20 {-0.5f,0.5f} 21}; 22 23 24int main() 25{ 26 if (glfwInit() == GL_FALSE) 27 { 28 std::cerr << "glfw初期化失敗。" << std::endl; 29 return -1; 30 } 31 32 33 atexit(glfwTerminate); //プログラム終了時の処理を登録 34 Window window; 35 36 //OpenGL Verison 3.2 Core Profile を選択する 37 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 38 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,2); 39 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 40 glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 41 42 Shape* shape = new Shape(2, 4, rectangleVertex); 43 44 Shader shader("Test.vert","Test.frag"); 45 shader.setBindAttribVertex(0, "Position"); 46 shader.setBindAttribFragment(0, "fragment"); 47 48 49 glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 50 while (window) 51 { 52 glClear(GL_COLOR_BUFFER_BIT); //カラーバッファをクリア 53 shader.Active(); 54 55 56 57 printf(": %d\n", window.getKeyInput(GLFW_KEY_SPACE)); 58 59 60 61 62 63 64 65 window.SwapBuffers(); //ダブルバッファリング 66 } 67 68} 69
cpp
1#include "Window.hpp" 2 3//コンストラクタ 4Window::Window(int width, int height, const char* title) 5 :window(glfwCreateWindow(width, height, title, NULL, NULL)), 6 wheel(0) 7{ 8 std::fill(std::begin(keyStatus),std::end(keyStatus),0); 9 10 if (window == NULL) 11 { 12 std::cerr << "ウインドウ生成失敗" << std::endl; 13 exit(1); 14 } 15 16 glfwMakeContextCurrent(window); //コンテキストを作成 17 18 glewExperimental = GL_TRUE; 19 if (glewInit() != GLEW_OK) 20 { 21 std::cerr << "GLFW 初期化失敗" << std::endl; 22 exit(1); 23 } 24 25 atexit(glfwTerminate); //プログラム終了時の処理を登録 26 glfwSwapInterval(1); //垂直同期 27 28 29 //イベント処理 30 glfwSetWindowUserPointer(window, this); //このインスタンスのthis 31 glfwSetWindowSizeCallback(window, Resize); //ウインドウサイズを変更する時に呼び出す処理 32 glfwSetScrollCallback(window,Wheel); //マウスホイール操作時に呼び出す処理 33////////////////////////////////////////////////////////////////////////////////////////////// 34 glfwSetKeyCallback(window, KeyBoard); //キー入力時に呼び出す処理 35////////////////////////////////////////////////////////////////////////////////////////////// 36 37 38 Resize(window, width, height); 39 40} 41 42//サイズ変更 43void Window::Resize(GLFWwindow* const win, int width, int height) 44{ 45 int fbWidth, fbHeight; 46 glfwGetFramebufferSize(win, &fbWidth, &fbHeight); 47 glViewport(0, 0, fbWidth, fbHeight); 48 49 Window* const instance = (Window*)glfwGetWindowUserPointer(win); 50 51 if (instance != NULL) 52 { 53 instance->size.x = (GLfloat)width; 54 instance->size.y = (GLfloat)height; 55 } 56} 57 58//ウインドウサイズを取得 59const glm::vec2 Window::getSize() const 60{ 61 return size; 62} 63 64 65//キー入力を取得 66const int Window::getKeyInput(int key)const 67{ 68 return keyStatus[key]; 69} 70 71//マウスホイール 72void Window::Wheel(GLFWwindow* win, double x, double y) 73{ 74 Window* const instance = (Window*)glfwGetWindowUserPointer(win); 75 76 if (instance != NULL) 77 { 78 instance->wheel += (GLfloat)y; 79 } 80} 81 82///////////////////////////////////////////////////////////////////////////////////////////////// 83//キー入力 84void Window::KeyBoard(GLFWwindow* win, int key, int scancode, int action, int mods) 85{ 86 Window* const instance = (Window*)glfwGetWindowUserPointer(win); 87 88 if (instance != NULL) 89 { 90 instance->keyStatus[key] = action; 91 } 92} 93//////////////////////////////////////////////////////////////////////////////////////////////// 94 95//bool 演算子 96Window::operator bool() 97{ 98 glfwPollEvents(); //イベントを取り出す 99 100 //ウインドウを閉じる必要があれば false 101 if (glfwWindowShouldClose(window) != 0) 102 { 103 return false; 104 } 105 else { 106 return true; 107 } 108} 109 110//ダブルバッファリング 111void Window::SwapBuffers()const 112{ 113 glfwSwapBuffers(window); 114} 115 116//デストラクタ 117Window::~Window() 118{ 119 glfwDestroyWindow(window); 120} 121
回答2件
あなたの回答
tips
プレビュー