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, Game
nesneyi oluşturur ve tüm GLFW başlatmayı yaparsın, ardından Game
iş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).