2016-07-06 6 views
0

これはGLFWに関する初心者の質問かもしれませんが、面白い問題があるようです。ですから、私はGLFWを使って簡単な入力処理クラスを開発しています。具体的には静的メソッドを利用して、メソッドを使用するヘッダーファイルのインクルードを必要とするだけです。だから、これは私のコードで、これまで...GLFWの入力処理が意図したとおりに機能しない

InputHandler.cpp

#include "InputHandler.h" 

GLFWwindow *Input::m_Window; 
bool Input::isDown; 
std::vector<int> Input::keyCache; 

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) 
{ 
    for (int _key = 0; _key < Input::keyCache.size(); _key++) 
    { 
     if (key == Input::keyCache[_key] && action == GLFW_PRESS || key == Input::keyCache[_key] && action == GLFW_REPEAT) 
      Input::isDown = true; 
     else 
      Input::isDown = false; 
    } 
} 

void Input::processInput(GLFWwindow* window) 
{ 
    m_Window = window; 
} 

bool Input::isKeyDown(int key) 
{ 
    keyCache.push_back(key); 
    glfwSetKeyCallback(m_Window, key_callback); 
    return isDown; 
} 

InputHandler.h

#pragma once 

#include <GLFW\glfw3.h> 
#include <vector> 

class Input 
{ 
public: 
    static bool isDown; 
    static std::vector<int> keyCache; 
private: 
    static GLFWwindow *m_Window; 

public: 
    static void processInput(GLFWwindow* window); 
    static bool isKeyDown(int key); 
    static bool isKeyUp(int key); 
    static int getMouseX(); 
    static int getMouseY(); 
}; 

しかし、私は、trueまたはベースfalseを返しますisKeyDownメソッドを呼び出したときにキーが押されていない場合、複数回、プログラムは最後に述べたキーにしか反応しないようです。私は、コードを使用している場合たとえば、...

if (Input::isKeyDown(GLFW_KEY_W) || Input::isKeyDown(GLFW_KEY_Q)) 
     std::cout << "Key is down" << std::endl; 

のみQキーは文をトリガする、Wは何もしません。私はGLFWのサイトを何度も訪れました。入力ガイドは入力を受け取るために必要なことを学んだ場所で、何も探していないので誰もこの問題を抱えていないようです。誰かが助けることができた場合、可能な問題を説明するか、自分自身で答えを見つけるという観点から私を正しい方向に向けることによって、私は非常に感謝しています!

+0

WとQの両方がキャッシュにあり、Wだけが押されているとき、key_callbackはどう思いますか?答え:isDownをtrueに設定し、isDownをfalseに設定してから、それを返します。その場合、isDownはfalseです。 – immibis

+0

ええ、それは今私にとって理にかなっています。私はおそらく前にそれを理解していたはずですが、私はそれが遅れていると私は疲れていることを自分自身に伝えます。 @immibisに応答する時間をとっていただきありがとうございます – Devurauxe

答えて

0

申し訳ありませんが、問題を把握しました。私はそれをovercomplicating WAAAAAAAAAAAAAAAAAAAAAAAAAAでした。だから、私の問題は、キーコールバックが1つのキーしか扱えないことで、それはまったく必要ないということでした。だから、私の問題を修正する修正プログラムを...キーコールバック、keyCacheとisDown変数を削除し、単純にisKeyDownを変更関与

bool Input::isKeyDown(int key) 
{ 
    if (glfwGetKey(m_Window, key)) 
     return true; 

    return false; 
} 

私は私があることを自分自身を示しているか途方もなく無能ごめんなさい。さて、私はキーコールバックの仕組みを知っています! xD

関連する問題