GLFW'nin klavye girişini başka bir nesneye nasıl iletebilirim?


9

GLFW3 ile başka bir sınıfta klavye olayları yürütmeye çalışırken sorun yaşıyorum. Sahip olduğum sorun GLFW3 gösterildiği gibi giriş için statik bir işlev kullanıyor olmasıdır:

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

uayrıca statiktir ve kontroller WSAD anahtarları için girişi tutar (anahtar olayları alabilmemin tek yolu). Buradan bir tuşa basıldığında konsol penceresinde hangi tuşa basıldığı görüntülenir. Yaşadığım sorun, başka bir sınıftaki bir değişkeni değiştirmek için basılan anahtarı kullanmaya çalışıyor.

MainMenu adlı işlevi olan başka bir sınıf update().var Bu işlev içinde UI sınıfımı kullanabileceğiniz bir yolu var mı?

Yanıtlar:


16

Statik bir UI sınıfıyla yanlış yaklaşımı kullanıyorsunuz. Statik bir geri çağrıdan bir örnek fonksiyonuna "sıçramanın" olağan yolu, atlamayı statik geri çağrıdan erişilebilir bir yerde yapabilen bir şeyi saklamaktır.

Bu tür statik geri çağrıları gerektiren GLFW ve yerel Win32 gibi çoğu API, yukarıdaki ilişkilendirmeyi yapmanın bir yolunu sunar. GLFW pencerelerinde, atayabileceğiniz işaretçi boyutunda bir depolama bloğu vardır: kullanıcı işaretçisi . Sen edebilirsiniz olsun veya set gerektiği gibi kullanıcının işaretçisi.

Çok yaygın bir örüntü, Game"HandleKeyPress (Key key)" gibi yöntemlere sahip bir sınıf türüne sahip olmaktır. Program başladığında, Gamenesneyi oluşturur ve tüm GLFW başlatmayı yaparsın, ardından Gameişaretçiyi kullanıcı veri deposuna doldurursun:

int main () {
  GLFWindow * window = ... create GLFW window ...
  Game game(... game constructor parameters ...);

  glfwSetWindowUserPointer(window, &game);

  ... main game loop ...
}

Ardından, klavye geri aramanız (ve diğer tüm statik geri çağrılar), Game *kullanıcı işaretçi deposundan paketini açıp ona iletebilir:

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
  Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
  game->HandleKeyDown(...);
}

HandleKeyDownÜzerinde yöntem Gameörneği gerçekten eğer, gerektiği takdirde UI nesnesine gidip gelecek (veya olabilir sadece UI nesne için klavye girişi ihtiyaç oyun gibi bir şey doldurma Ancak, kullanıcı depolama UI nesneye bir işaretçi şeyler sadece olabilir veya daha yüksek düzeydeki bir şey genellikle daha iyidir çünkü her pencere için yalnızca bir işaretçiniz vardır).


0

Şimdilik bununla ilgili olarak, tek bir nesne kullanıyordum, sınıfa erişmek gerektiğinde sadece singletona işaretçiyi alabilirdim:

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)
}

Böyle bir şey.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.