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

Duyurular

27 Haziran 2014 Cuma

Glfw Klavye Girdileri - Bölüm 2


Önceki yazımda, normal tuş girdisi almayı ve girdilere göre işlem tanımlamayı anlatmıştım. Bu bölümde Değiştirici (Modifier) tuş girdileri nasıl kullanılır, öğrenelim.

Değiştirici tuşlar nedir?

Değiştirici (Modifier) tuşlar, anlamını fazla bilmesek de çok sık kullandığımız ve hepimizin aşina olduğu Ctrl, AltShift ve Super kısayol tuşlarıdır. Bu tuşlar tek başlarına kullanılabildiği gibi, normal tuşlar ile birlikte kullanımında normal tuşların özelliğini değiştiren klavye tuşlarıdır.

Biraz karmaşık bir tanım oldu, farkındayım. Bunu şöyle bir örnekle açıklayalım.

Hemen hemen bilgisayarla uğraşan herkes bir kerede olsa internet kullanırken, ofis programlarında yazı yazarken, 3D modelleme programları kullanırken ve hatta oyun oynarken denk gelmişsinizdir. Bu tarz programlar ve oyunlar, yazı yazmak için kullandığımız normal tuşları, işe yarayan farklı işlemler (Kopyala, Yapıştır, ..., vb işlemler) yapabilmek için  normal tuşları dönüşüme (normal tuşlardan ayırt edebilmek için) tabi tutar.

Mesela, internet ve ofis programlarında yazı yazarken, belki çok sık kullandığımız 'Kopyala' (Ctrl + C), 'Yapıştır' (Ctrl + V), 'Yeni Sekme ve Belge' (Ctrl + N), ..., vb işlemler gibi.
Şimdi oynadığınız oyunlarda aklınıza gelmemiş olabilir, örneğin 'Red Alert 2' veya 'Age of Empires 2' gibi strateji oyunlarında bölükleri 'Shift + 1, Shift + 2, Shift + n, ...,' şeklinde numaralandırma yaparak, '1, 2, 3, ...' tuşları ile kısa yoldan seçebiliyorduk.
World of Warcraft (WoW), Tera ve sayamadığım birçok mmorpg türü oyunlarında ve işlemlere tuş atanabilen tüm oyunlarda kendi oluşturduğumuz kısa yollarını kullanabiliyorduk.

Kullanımı

Değiştirici ve normal tuşları ayırt edebilmek için farklı bir algoritma kullandım. Bu algoritmada iç içe switch-case ve en iç de if-else koşul fonksiyonlarını kullandım.

Aşağıdaki örnek kodda, 'Alt + F4' kısayolu ile pencere sonlandırılıyor, ve temsili olarak 'Ctrl + C' ve 'Ctrl + V' (kopyala ve yapıştır) işlemlerini çıktı aldırdı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);
else{
// Klavye tuş girdilerinin durumuna göre işlem yap.
switch(action){
// Herhangi bir tuşa basıldığında...
case GLFW_PRESS:
// Modifier veya Normal Tuş kontrolü
switch(mods){
case GLFW_MOD_ALT:
cout << "Klavye Girdisi -> Alt tusu basildi" << endl;
if(key == GLFW_KEY_F4)
glfwSetWindowShouldClose(window, GL_TRUE);
break;
case GLFW_MOD_CONTROL:
cout << "Klavye Girdisi -> Ctrl tusuna basildi" << endl;
// 'Ctrl + C' kopyalama kısayolu tuş ataması
if(key == GLFW_KEY_C)
cout << "Islem -> Istenilen icerik kopyalanmistir." << endl;
else if(key == GLFW_KEY_V)
cout << "Islem -> Istenilen icerik yapistirilmistir." << endl;
break;
case GLFW_MOD_SHIFT:
cout << "Klavye Girdisi -> Shift tusu birakildi" << endl;
break;
case GLFW_MOD_SUPER:
cout << "Klavye Girdisi -> Super tusu birakildi" << endl;
break;
default:
cout << "Klavye Girdisi -> Normal tus birakildi" << endl;
break;
}
break;

// Herhangi bir tuş bırakıldığında...
case GLFW_RELEASE:
// Modifier veya Normal Tuş kontrolü
switch(mods){
case GLFW_MOD_ALT:
cout << "Klavye Girdisi -> Alt tusu birakildi" << endl;
break;
case GLFW_MOD_CONTROL:
cout << "Klavye Girdisi -> Ctrl tusu birakildi" << endl;
break;
case GLFW_MOD_SHIFT:
cout << "Klavye Girdisi -> Shift tusu birakildi" << endl;
break;
case GLFW_MOD_SUPER:
cout << "Klavye Girdisi -> Super tusu birakildi" << endl;
break;
default:
cout << "Klavye Girdisi -> Normal tus birakildi" << endl;
break;
}
break;

// Herhangi bir tuş basılı tutulduğunda...
case GLFW_REPEAT:
// Modifier veya Normal Tuş kontrolü
switch(mods){
case GLFW_MOD_ALT:
cout << "Klavye Girdisi -> Alt tusu basili tutuluyor" << endl;
break;
case GLFW_MOD_CONTROL:
cout << "Klavye Girdisi -> Ctrl tusu basili tutuluyor" << endl;
break;
case GLFW_MOD_SHIFT:
cout << "Klavye Girdisi -> Shift tusu basili tutuluyor" << endl;
break;
case GLFW_MOD_SUPER:
cout << "Klavye Girdisi -> Super tusu basili tutuluyor" << endl;
break;
default:
cout << "Klavye Girdisi -> Normal tus basili tutuluyor" << endl;
break;
}
break;
}
}
}
İlk switch-case yapısında, 'action' fonksiyon parametresi ile tuşların durumunu (GLFW_PRESS, GLFW_REPEAT, GLFW_RELEASE) ayrıştırdık.
Daha sonra tuşların durumuna göre yeni bir switch-case yapısında, 'mods' fonksiyon parametresine göre değiştirici ve normal tuşları birbirinden ayrıştırdık.

'mods' parametresinin alabileceği değerler;
  • GLFW_MOD_SHIFT - Shift tuşu
  • GLFW_MOD_CONTROL - Ctrl tuşu
  • GLFW_MOD_ALT - Alt tuşu
  • GLFW_MOD_SUPER - Başlat tuşu gibi tuşlar...
Ve en son olarak if-else yapısı ile 'key' fonksiyon parametresine göre normal tuşları istediğimiz şekilde kombine edebilmekteyiz.

Sonuç

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__mods.html

Hiç yorum yok:

Yorum Gönderme