2016-07-06 7 views
0

Das könnte also eine neue Frage bezüglich GLFW sein, aber ich habe ein interessantes Problem. Also entwickle ich eine einfache Input-Handling-Klasse mit GLFW, die insbesondere statische Methoden verwendet, um nur die Einbeziehung der Header-Datei für die Verwendung der Methoden zu ermöglichen. Das ist also mein Code so weit ...GLFW Eingabehandhabung funktioniert nicht wie vorgesehen

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(); 
}; 

Jedes Mal, wenn ich die isKeyDown Methode aufrufen, die zurückkehren wird wahr oder falsch ist, basierend Wenn der Schlüssel mehrmals gedrückt ist, scheint das Programm nur auf den zuletzt genannten Schlüssel zu reagieren. Zum Beispiel, wenn ich den Code ...

nur die Q-Taste löst die Anweisung, W tut nichts. Ich habe die Website von GLFW mehrmals durchsucht, die Eingabeanleitung ist, wo ich die notwendigen Dinge gelernt habe, um die Eingabe zu erhalten, und es scheint auch, dass niemand sonst dieses Problem hatte, da ich nach etwas gesucht und gesucht habe. Wenn jemand helfen könnte, indem er mögliche Probleme erklärt oder mich in die richtige Richtung weist, um die Antwort selbst zu finden, würde ich es sehr schätzen!

+0

Was denkst du key_callback, wenn sowohl W als auch Q im Cache sind und nur W gedrückt wird? Antwort: Es setzt IsDown auf True, dann setzt es IsDown auf False, dann kehrt es zurück. Also isDown ist in diesem Fall falsch. – immibis

+0

Ja, das macht jetzt Sinn für mich. Ich hätte das wahrscheinlich schon früher verstanden, aber ich werde mir immer wieder sagen, dass es spät ist und dass ich müde bin. Vielen Dank, dass Sie sich die Zeit genommen haben, auf @immibis zu antworten – Devurauxe

Antwort

0

In Ordnung, ich habe mein Problem herausgefunden. Ich war WAAAAAAAAAAAAAAAAAAAAAAAAAY überkompliziert es. Mein Problem war also, dass der Schlüssel-Callback nur einen Schlüssel verarbeiten konnte und völlig unnötig war. Also, meine Verlegenheit beteiligt den Schlüssel Rückruf entfernen, die keyCache und die isDown Variable und einfaches Ändern isKeyDown zu ...

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

    return false; 
} 

Es tut mir leid für die, wie lächerlich inkompetent Ich habe mich erwiesen. Nun, jetzt weiß ich, wie der Key Callback funktioniert! xD

Verwandte Themen