2017-12-21 3 views
0

Wie Sie wissen, GLFW arbeitet mit Rückrufe für Ein- und Callback-Funktionen haben bestimmte Signaturen, die Benutzer müssen übereinstimmen ändern. Hier ist ein Beispiel aus der Dokumentation:GLFW Eingang Rückruf ein Objekt mit einer Memberfunktion

void key_callback(GLFWwindow* window, int key, int scancode, int action, int 
mods) 
{ 
    if (key == GLFW_KEY_E && action == GLFW_PRESS) 
     activate_airship(); 
} 

Jetzt aktivieren Luftschiff scheint eine globale Funktion hier zu sein. Was ich wirklich tun möchte, ist, irgendein Objekt möglicherweise in jeder Eingangsstufe zu modifizieren. Deshalb mag ich so etwas wie:

void key_callback(Airship a, GLFWwindow* window, int key, int scancode, int 
        action, int mods) 
{ 
    if (key == GLFW_KEY_W && action == GLFW_PRESS) 
     a.render_Wireframe(); 
} 

Wie Sie sehen können, möchte ich das Objekt zu übergeben ich zu ändern versuchen, Airship hier. Aber dieses Mal ist die Rückrufsignatur nicht zulässig. Ich kann es nicht mehr benutzen. Was ist der beste Weg, dies zu erreichen? Ich versuche, Ideen zu entwickeln, aber in Zukunft möchte ich das vielleicht ändern, um nicht nur mit Luftschiffen, sondern auch mit einem neuen Objekt, das ich hinzufüge, arbeiten zu können. Was sollte das Design hier sein?

Die Sache ist, mit der Fähigkeit, einen Rückruf für ganzes Programm zu setzen, ich weiß nicht, wie die folgenden zu erreichen. Nehmen wir an, ich habe zwei Objekte Airship und Battlesip. Ich möchte, dass beide einen eigenen Eingabehandhabungsmechanismus haben. Durch Drücken W sollte etwas tun, wenn Airship das aufgenommene Objekt in der Szene ist und etwas anderes, wenn Battleship das aufgenommene Objekt ist.

Deshalb möchte ich etwas haben, wie am Ende folgenden;

class Airship : public SceneObject 
{ 
    ... 
    void input_handle(){ 
     if(is_picked && pressed == GLFW_KEY_W) 
      launch_missile(); 
    } 
} 

class Battleship : public SceneObject 
{ 
    ... 
    void input_handle(){ 
     if(is_picked && pressed == GLFW_KEY_W) 
      do_something_else(); 
    } 
} 

Und in meiner Haupt-Schleife habe ich einen Vektor von SceneObject und ich rufe input_handle auf jedem Rahmen für jedes Objekt. Ich weiß nicht, wie kann ich so etwas mit einem einzigen Callback-Schema von GLFW behandeln. Ich kann diese Dinge nicht als Callback-Funktionen an ein Fenster übergeben, auch wenn ich die Signatur gefunden habe, weil sie Klassenmitglieder sind. Nun würde sich nichts ändern, wenn ich Klassenmitglieder passieren könnte, da ich nur einen Rückruf setzen kann.

Antwort

0

Hier ist, wie ich dieses Problem in einer vereinfachten Art und Weise zu lösen endete. Ich bin mir nicht sicher, ob dies das richtige Design ist, aber es könnte für einen zukünftigen Betrachter hilfreich sein. Ich habe einen Szenengraph wie Objekt, sagt SceneGraph, die all SceneObjects in der Frage erwähnt hält. Ich endete damit, dieses SceneGraph Objekt zu einem Singleton zu machen. Ich habe ein Szenendiagramm pro Lauf, daher erschien es mir logisch, es zu einem Singleton zu machen.

Natürlich können Sie den Tastenstatus usw. an Ihre Eingangsroutinen übergeben. Ich wollte nur das minimale Design zeigen, mit dem ich zusammen war. Das Objektauswahl-Beispiel, über das ich in der ursprünglichen Frage gesprochen habe, kann jetzt ebenfalls behandelt werden.

Verwandte Themen