Bagaimana saya bisa meneruskan input keyboard GLFW ke objek lain?

9

Saya mengalami kesulitan mencoba menjalankan acara keyboard di kelas lain dengan GLFW3. Masalah yang saya alami adalah GLFW3 menggunakan fungsi statis untuk input seperti yang ditunjukkan:

static UI u;
...
...
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    u.controls(window, key, action);
}

ujuga statis dan kontrol memegang input untuk kunci WSAD (satu-satunya cara saya bisa mendapatkan acara utama). Dari sini, menekan tombol berfungsi menampilkan tombol mana yang ditekan di jendela konsol. Masalah yang saya alami adalah mencoba menggunakan tombol yang ditekan untuk memanipulasi variabel di kelas lain.

Saya memiliki kelas lain yang disebut MainMenu yang memiliki fungsi. update().Adakah cara saya bisa menggunakan kelas UI saya di dalam fungsi ini?

ChocoMan
sumber

Jawaban:

16

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 Gamekelas yang memiliki metode seperti "HandleKeyPress (tombol Key)" atau yang lainnya. Ketika Anda memulai program, Anda membuat Gameobjek dan melakukan semua inisialisasi GLFW Anda, lalu memasukkan Gamepointer 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 HandleKeyDownmetode pada Gamecontoh 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).


sumber
0

Cara saya mengatasinya untuk saat ini adalah dengan menggunakan objek singleton, ketika saya perlu mengakses kelas saya hanya bisa mengambil pointer ke singleton:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    InputManager * in_manager = InputManager::get_instance();
    in_manager->handle_key_press( params)
}

Entah seperti itu.

pengguna1777995
sumber