Bạn đang sử dụng sai phương pháp với lớp UI tĩnh. Cách thông thường để "bật lại" từ một cuộc gọi lại tĩnh đến một chức năng cá thể là lưu trữ thứ gì đó có khả năng thực hiện bước nhảy ở một nơi có thể truy cập được từ cuộc gọi lại tĩnh.
Hầu hết các API, như GLFW và Win32 bản địa, yêu cầu các loại gọi lại tĩnh này cung cấp một cách để tạo liên kết ở trên. Các cửa sổ GLFW có một khối lưu trữ có kích thước con trỏ mà bạn có thể gán cho: con trỏ người dùng . Bạn có thể nhận hoặc đặt con trỏ người dùng này khi cần thiết.
Một mô hình rất phổ biến là có một số loại Game
lớp có các phương thức như "HandleKeyPress (Khóa phím)" hoặc không có gì. Khi chương trình bắt đầu, bạn tạo Game
đối tượng và thực hiện tất cả khởi tạo GLFW, sau đó nhét Game
con trỏ vào bộ lưu trữ dữ liệu người dùng:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Sau đó, cuộc gọi lại bàn phím của bạn (và tất cả các cuộc gọi lại tĩnh khác) có thể giải nén Game *
khỏi bộ lưu trữ con trỏ người dùng và chuyển tiếp tới nó:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
Các HandleKeyDown
phương pháp trên Game
dụ có thể chuyển tiếp cùng với đối tượng giao diện người dùng của bạn nếu cần thiết (hoặc, nếu bạn thực sự chỉ cần đầu vào bàn phím cho các đối tượng giao diện người dùng bạn chỉ có thể nhét một con trỏ đến đối tượng giao diện người dùng của bạn trong việc lưu trữ của người dùng, tuy nhiên, nhồi nhét một cái gì đó giống như trò chơi hoặc một cái gì đó cấp cao hơn thường tốt hơn vì bạn chỉ có một con trỏ trên mỗi cửa sổ để sử dụng).