Я пытаюсь создать небольшой игровой движок с OpenGL и GLFW. Я пытался заставить входные данные работать, и они работают! Но это очень неуклюже, потому что вам нужна ссылка на объект окна, а это означает, что неудобно обрабатывать входные данные из сценариев, отличных от main.cpp.
#include<iostream>
#include "inputHeader.h"
#include <GLFW/glfw3.h>
bool GetKey(GLFWwindow* window, int KeyCode)
{
if (glfwGetKey(window, KeyCode) == GLFW_PRESS)
return true;
else
return false;
}
bool GetKeyDown(GLFWwindow* window, int key) {
static bool keyPreviouslyPressed[GLFW_KEY_LAST + 1] = { false };
if (glfwGetKey(window, key) == GLFW_PRESS && !keyPreviouslyPressed[key]) {
keyPreviouslyPressed[key] = true;
return true;
}
return false;
}
//input activation from main.cpp
if (GetKey(window, GLFW_KEY_SPACE))
{
//do stuff
}
Как я могу сделать так, чтобы вам не требовалась ссылка на объект окна для обработки ввода?
Что ж, вы можете изучить шаблоны поведенческого дизайна [1] в вашем случае я считаю, что шаблона наблюдателя будет достаточно. К счастью, ваша подсказка похожа на эту публикацию [2] использование обратных вызовов, обеспечивающих некоторые механизмы обработки событий.
GLFWkeyfun glfwSetKeyCallback (GLFWwindow * window, GLFWkeyfun callback)
Но это очень неуклюже, потому что вам нужна ссылка на объект окна, а это означает, что неудобно обрабатывать входные данные из сценариев, отличных от main.cpp. Часть, которую вы называете неуклюжим, улучшает дизайн кода. Альтернативой является использование глобальных переменных, которые обычно не являются хорошим решением. Учитывая все вышесказанное, я думаю, что ваша проблема связана с тем, что вы используете множество бесплатных функций, а не классов. С помощью классов вы можете использовать
GLFWwindow*
в качестве переменной-члена класса ваших объектов, и вам не придется так часто передавать ее.