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.