Bu yazımda klavye girdilerini (keyboard inputs) nasıl kontrol edilebildiğini öğreneceğiz. Anlatımın daha anlaşılabilir olması açısından, 2D kare örneğini nasıl hareket ettirdiğimizi görelim.
Dersimize klavye girdilerine erişebilmek için kullanacağımız fonksiyonları tanımakla başlayalım.
// Prototip TanımıglfwSetKeyCallback: GLFWkeyfun fonksiyon gösterici (Function pointer) türünden bir fonksiyondur. Pencere klavye mesajlarını bir geri çağırım (callback) fonkisyonuna tanımlamaya (yönlendirmeye) yarar.
GLFWkeyfun glfwSetKeyCallback {GLFWwindow * window, GLFWkeyfun cbfun);
// Kullanım Şekli
glfwSetKeyCallback {window, fonksiyon_adi);
Fonksiyon Parametreleri ;
- GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
- GLFWkeyfun cbfun - GLFWkeyfun fonksiyon gösterici türünden bir fonksiyon ismi
// Prototip TanımıKlavye girdilerinin bilgisini almak ve ihtiyacınıza göre programlayabilmek için oluşturmanız gereken geri çağırım fonksiyonu.
typedef void(* GLFWkeyfun)(GLFWwindow *, int, int, int, int)
// Kullanım Şekli
static void fonksiyon_adi(GLFWwindow *window, int key, int scancode, int action, int mods){
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
Fonksiyon Parametreleri ;
- GLFWwindow *window - Önceden oluşturduğumuz ve kullanacağımız pencere nesnesi
- int key - Klavye'de basılan ve bırakılan tuş girdi değerlerini alabileceğimiz değişken, tanımlanan tuş değerleri için tıklayınız.
- int scancode - Platform ve sistemlere özgü tuş girdisi değerlerini alabileceğimiz değişken. Tahminim; özel tasarlanmış klavyeler, farklı girdi aletleri, tablet gibi dokunmatik uygulamalar ve vb. sistemler için gerekli
- int action - Klavye girdilerinin durum (basma, bırakma ve basılı tutma) bilgisini alabileceğimiz değişken. Kullanabilir sabitler; GLFW_PRESS, GLFW_RELEASE yada GLFW_REPEAT
- int mods - Sistem tuşları yada değiştirici tuşlar (Modifier keys), "Ctrl", "Shift" ve "Alt" tuşlarının girdisini alabileceğimiz değişken.
// Global Değişkenler2 boyutlu kareyi hareket ettirebilmek için x ve y koordinat düzlemlerini global değişken olarak tanımlayın.
// 2D düzlemde koordinat değişkenleri
GLfloat x = 0.0f;
GLfloat y = 0.0f;
Not: GLfloat, aslında float türünün yeniden typedef ile adlandırılmış halidir. Bu konu OpenGL derslerinde anlatılacaktır.
// Klavye Girdisi gerçekleştiğinde çağırılacak fonksiyonu belirten fonksiyonOluşturacağınız geri çağırım fonksiyonunu, glfwSetKeyCallback fonksiyonunu kullanarak kütüphaneye tanımlayın. Geri çağırım fonksiyonuna istediğiniz adı verebilirsiniz. Örneğimde fonksiyon adını, "klavye_callback" olarak kullandım.
glfwSetKeyCallback(window, klavye_callback);
// Klavye mesajlarının işlendiği callback fonksiyonuSırada geri çağırım fonksiyonunu tasarlamaya geldi. Burada 'key' değişkeninde ki değere göre basılan tuşu ve 'action' değişkeninde ki değerin durumuna göre yapılacak işlemleri belirliyoruz. Programcılık deneyiminize ve kullanıma bağlı olarak 'if-else' veya 'switch-case' karar-kontrol fonksiyonlarını (mekanizmalarını) kullanabilirsiniz.
static void klavye_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{
// Esc tuşuna basıldığında, pencereyi kapat
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
// Klavye Tuşlarına göre çıktı ve 2D Karemizi hareket ettirme
else if(key == GLFW_KEY_W && action == GLFW_PRESS){
cout << "Klavye Girdisi -> W tusuna basildi" << endl;
y += 0.1f;
}
else if(key == GLFW_KEY_S && action == GLFW_PRESS){
cout << "Klavye Girdisi -> S tusuna basildi" << endl;
y -= 0.1f;
}
else if(key == GLFW_KEY_A && action == GLFW_PRESS){
cout << "Klavye Girdisi -> A tusuna basildi" << endl;
x -= 0.1f;
}
else if(key == GLFW_KEY_D && action == GLFW_PRESS){
cout << "Klavye Girdisi -> D tusuna basildi" << endl;
x += 0.1f;
}
}
Geri çağırım örneğimizde, İlk karar-kontrol fonksiyonu 'if' ile "eğer 'Esc' tuşuna basılırsa, pencereyi kapat." demiş olduk. Yani 'Esc' tuşu ile pencereyi kapatarak, programın sonlanmasına izin veriyoruz. Devamında gelen 'if-else' karar-kontrol fonksiyonlarında klavyemizin W, A, S, D tuşlarını basılma durumuna göre aynı günümüz oyunlarında yaygın olarak kullanılan yön tuşları gibi 2D kareyi hareket ettirmeyi ve konsol penceresinde çıktı almayı sağladık.
Bitbucket: main.cpp dosyasını indirmek için tıklayın.
Referans:
http://www.glfw.org/docs/latest/group__input.html
http://www.glfw.org/docs/latest/group__keys.html
Hiç yorum yok:
Yorum Gönder