Glfw ile Fare Girdileri - Mustafa Sabri OĞUZ

Duyurular

18 Nisan 2014 Cuma

Glfw ile Fare Girdileri


Sadece 3D Grafik ve oyunlarda değil, hemen hemen her bilgisayar programında fareye (mouse) ihtiyaç duyarız. Bu dersimizde glfw'in basit fare fonksiyonlarını tanımayı ve fare girdilerini OpenGL içeriği üzerinde nasıl kullanabileceğimizi öğrenelim.

Dersimize mouse girdilerine erişebilmek için kullanacağımız fonksiyonları tanımakla başlayalım.
// Prototip tanımı
GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow *window, GLFWmousebuttonfun cbfun);

// Kullanım şekli
glfwSetMouseButtonCallback(window, fonksiyon_adi);
glfwSetMouseButtonCallback: GLFWmousebuttonfun fonksiyon gösterici (Function pointer) türünden bir fonksiyondur. Pencere fare mesajlarını (girdilerini) 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
  • GLFWmousebuttonfun cbfun - GLFWmousebuttonfun fonksiyon gösterici türünden bir callback fonksiyon ismi
// Prototip tanımı
typedef void(* GLFWmousebuttonfun)(GLFWwindow *, int, int, int)

// Kullanım şekli
static void fonksiyon_adi(GLFWwindow *window, int button, int action, int mods)
{
if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{
cout << "Mouse Girdisi -> Sol tusa basildi" << endl;
}
}
Mouse 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 button- Mouse'a 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 action - Klavye girdilerinin durum (basma, bırakma ve basılı tutma) bilgisini alabileceğimiz değişken. Kullanabilir sabitler; GLFW_PRESSGLFW_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.
Gördüğünüz üzere ufak bir detay hariç fonksiyonlar, klavye fonksiyonlarına benzemektedir. Şimdi ise ufak bir örnekle nasıl kullanılacağına bakalım.

// Mouse Girdisi gerçekleştiğinde çağırılacak fonksiyonu belirten fonksiyon
glfwSetMouseButtonCallback(window, mouseBut_callback);
Aynı klavye örneğimizde olduğu gibi kütüphaneye fare geri çağırım (callback) fonksiyonumuzu glfwSetMouseButtonCallback() fonksiyonu sayesinde tanımlıyoruz.

static void mouseBut_callback(GLFWwindow *window, int button, int action, int mods)
{
if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{
cout << "Mouse Girdisi -> Sol tusa basildi" << endl;
x -= 0.1f;
}
else if(button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS)
{
cout << "Mouse Girdisi -> Sag tusa basildi" << endl;
x += 0.1f;
}
else if(button == GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW_PRESS)
{
cout << "Mouse Girdisi -> Orta tusa basildi" << endl;
x = 0.0f;
y = 0.0f;
}
}
Üsteki gibi geri çağırım fonksiyonumuzu global fonksiyon olarak tanımlayın. Faremizin geri çağırım fonksiyonunda, farenin 'Sol' tuşuna basıldığında üçgenimiz 'x' düzleminde değeri eksiltilerek, sola doğru hareket etmesini, farenin 'Sağ' tuşuna basıldığında 'x' düzleminde değeri arttırarak, sağa doğru hareket etmesini ve faremizin 'Orta' tuşunu basıldığında ise üçgenimizin başlangıç noktasına, yani  x ve y düzleminin değişkenlerini sıfırlamasını (resetlemesini) sağladık. Ve son olarak konsol penceremizde çıktısını alarak kontrol ediyoruz.

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

Hiç yorum yok:

Yorum Gönderme