Glfw ile Klavye Girdileri - Bölüm 1 - Mustafa Sabri OĞUZ

Duyurular

11 Nisan 2014 Cuma

Glfw ile Klavye Girdileri - Bölüm 1


3D grafik ve oyun uygulamalarında bize gerekebilecek özelliklerden bir tanesi de klavye hakimiyetidir. Program için kullanımı kolaylaştıracak kısayollar, klavye üzerinde ki tuşlara çeşitli fonksiyonlar atayarak daha dinamik bir program oluşturabiliriz.

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ı
GLFWkeyfun glfwSetKeyCallback {GLFWwindow * window, GLFWkeyfun cbfun);

// Kullanım Şekli
glfwSetKeyCallback {window, fonksiyon_adi);
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.
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ı
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);
}
Klavye girdilerinin bilgisini almak ve ihtiyacınıza göre programlayabilmek için oluşturmanız gereken geri çağırım fonksiyonu.
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.
Yukarı gerekli açıklamaları okuduk, artık bir örnekle bunu pekiştirelim.

// Global Değişkenler
// 2D düzlemde koordinat değişkenleri
GLfloat x = 0.0f;
GLfloat y = 0.0f;
2 boyutlu kareyi hareket ettirebilmek için x ve y koordinat düzlemlerini global değişken olarak tanımlayın.

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 fonksiyon
glfwSetKeyCallback(window, klavye_callback);
Oluş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.

// Klavye mesajlarının işlendiği callback fonksiyonu
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;
}
}
Sı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.

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önderme