Я делаю небольшой проект, в котором я в основном создаю свой собственный движок / фреймворк для c ++ для создания графики и / или простых игр.Я использую OpenGL с GLFW.Моя цель - сделать что-то похожее на различные графические фреймворки, такие как raylib или openFrameworks (но, конечно, урезанные)
На самом деле пока все работает нормально, но я не могу понять, как правильно отделить вход откласс окна, поскольку наличие ввода дескриптора окна мне кажется довольно неуклюжим и просто загромождает класс окна.
Это быстрое упрощенное воссоздание моего класса окна.(Я не включил класс enum в коды клавиш.)
#pragma once
#include "../extern/GLFW/glfw3.h"
#include <string>
class Window {
private:
GLFWwindow* mWindow;
int mWidth;
int mHeight;
std::string mTitle;
public:
Window();
~Window();
void createWindow(std::string title, int width, int height);
void mainLoop();
GLFWwindow* getWindow() const { return mWindow; }
// Input
private:
bool Window::getKeyStatus(KEY key) {
static void keyCallback(GLFWwindow* mWindow, int key, int scancode, int action, int mods);
bool isKeyDown(KEY key);
};
И это реализация плюс
#include "Window.h"
#include <iostream>
Window::Window() {}
Window::~Window() {}
void Window::createWindow(std::string title, int width, int height) {
if (!glfwInit());
mWindow = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr);
if (!getWindow()) {
glfwTerminate();
}
glfwSetWindowUserPointer(getWindow(), this);
glfwMakeContextCurrent(getWindow());
glfwSetKeyCallback(mWindow, keyCallback);
}
void Window::mainLoop() {
while (!glfwWindowShouldClose(getWindow())) {
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(getWindow());
/* Poll for and process events */
glfwPollEvents();
if (isKeyDown(KEY::A)) {
std::cout << "A down" << std::endl;
}
if (isKeyDown(KEY::B)) {
std::cout << "B down" << std::endl;
}
}
glfwTerminate();
}
void Window::keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
Window* win = (Window*)glfwGetWindowUserPointer(window);
if (key == (int)KEY::ESCAPE && action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GL_TRUE);
} else {
win->currentKeyState[key] = action;
}
}
bool Window::getKeyStatus(KEY key) {
return glfwGetKey(mWindow, (int)key);
}
bool Window::isKeyDown(KEY key) {
bool down = false;
if (getKeyStatus(key) == 1) {
down = true;
}
return down;
}
Как я могу исходить из этого?Моя главная проблема в том, что я не могу соединить свое окно и класс ввода.Должен ли я использовать классы наследования или друзей.Должны ли я иметь обратные вызовы glfw в классе окна (который я предполагаю) или я должен переместить их в класс ввода?Как я могу соединить эти два класса, чтобы мне не всегда приходилось использовать указатели окон, например «isKeyDown (GLFWwindow * window, Key keycode)», а вместо этого только «isKeyDown (Key keycode)».Если это не слишком много, спросите, может кто-нибудь написать упрощенный класс ввода?
Заранее спасибо