Anda mengambil pendekatan yang salah dengan kelas UI statis. Cara biasa untuk "terpental" dari panggilan balik statis ke fungsi contoh adalah menyimpan sesuatu yang mampu membuat lompatan di tempat yang dapat diakses dari panggilan balik statis.
Sebagian besar API, seperti GLFW dan Win32 asli, yang memerlukan jenis panggilan balik statis ini menyediakan cara untuk membuat asosiasi di atas. Jendela GLFW memiliki blok penyimpanan berukuran pointer yang dapat Anda tetapkan untuk: pointer pengguna . Anda bisa mendapatkan atau mengatur pointer pengguna ini sesuai kebutuhan.
Pola yang sangat umum adalah memiliki semacam Game
kelas yang memiliki metode seperti "HandleKeyPress (tombol Key)" atau yang lainnya. Ketika Anda memulai program, Anda membuat Game
objek dan melakukan semua inisialisasi GLFW Anda, lalu memasukkan Game
pointer ke penyimpanan data pengguna:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Kemudian, panggilan balik keyboard Anda (dan semua panggilan balik statis lainnya) dapat membongkar Game *
dari penyimpanan penunjuk pengguna dan meneruskannya:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
The HandleKeyDown
metode pada Game
contoh dapat meneruskan bersama untuk objek UI Anda jika diperlukan (atau, jika Anda benar-benar hanya perlu input keyboard untuk objek UI Anda hanya bisa barang pointer ke objek UI Anda dalam penyimpanan pengguna, bagaimanapun, isian sesuatu seperti permainan atau sesuatu tingkat yang lebih tinggi umumnya lebih baik karena Anda hanya memiliki satu pointer per jendela untuk digunakan).