Yazan : Şadi Evren ŞEKER
Bu yazının amacı OpenGL ortamında kullanıcının klavey ve mouse ile yapmış olduğu etkilerin nasıl algılandığını açıklamaktır.
Yazıya başlamadan önce belirtilmelidir ki OpenGL bir çizim ve grafik animasyon geliştirme ortamıdır ve bu ortamın görevleri arasında kullanıcı ilişkileri bulunmamaktadır. Bunun yerine yine OpenGL ile artık özdeşleşmiş olan GLUT (Graphics Library Utility Toolkit) isimli kütüphane kullanılmaktadır.
Bu kütüphaneyi yüklemek için :
#include <GL/glut.h>
satırı yazılarak glut.h dosyası projeye dahil edilir (include)
Fare işlemleri (mouse)
Öncelikle OpenGL main fonksiyonunun içerisinde bir mouse fonksiyonu tanımlamak gerekir. Bunun için glut kütüphanesinde bulunan ve bir fonksiyon göstericisi kullanan glutMouseFunc aşağıdaki şekilde bir mouse fonksiyonu tanımlar:
glutMouseFunc(mouse);
Yukarıdaki bu satır main içerisine yazıldıktan sonra aşağıdakine benzer mouse isminde bir fonksiyon kodlanabilir:
void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
printf(“x: %d y: %d”,x,y);
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
break;
default:
break;
}
}
Yukarıdaki mouse fonksiyonunun ismi farklı olabilmekle beraber prototipi yukarıdaki fonksiyonun aynısı olmalıdır. Buna göre fonksiyon 4 adet int değişken almalıdır.
Alınan bu değişkenlerin anlamları sırasıyla
button: farenin hangi düğmesine basıldığını gösterir (GLUT_LEFT_BUTTON: sol tuş, GLUT_RIGHT_BUTTON: sağ tuş, GLUT_MIDDLE_BUTTON : orta tuş)
state: düğmenin durumunu verir. (GLUT_DOWN: Düğmeye basıldı, GLUT_UP: Düğme bırakıldı)
x: ekrandaki x koordinatı
y: ekrandaki y koordinatı
yukarıdaki bu değişkenlerin değerleri örneğin
button = GLUT_LEFT_BUTTON , state = GLUT_DOWN , x =100, y=250
şeklindeyse, ekranın 100,250 koordinatlarına farenin sol tuşu ile tıklanmış demektir. Bu koordinat sistemi ekranın sol üst köşesini 0,0 olarak kabul eden ve ekranın sağ alt köşesi , main fonksiyonundaki glutInitWindowSize fonksiyonuna parametre olarak verilen değer olan koordinat sistemidir.
Klavye işlemleri
Fare işlemine benzer olarak main fonksiyonunun içerisinde:
glutKeyboardFunc(keyboard);
fonksiyonu yazılarak bir fonksiyon gösteiricisi parametre verilir. Aşağıda örnek bir klavye fonksiyon kodlaması bulunmaktadır:
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case ‘r’:
case ‘R’:
printf (“Klaveyden r tuşuna basıldın”);
break;
case ‘z’:
zoomFactor += 0.5;
if (zoomFactor >= 3.0)
zoomFactor = 3.0;
printf (“zoomFactor is now %4.1fn”, zoomFactor);
break;
case ‘Z’:
zoomFactor -= 0.5;
if (zoomFactor <= 0.5)
zoomFactor = 0.5;
printf (“zoomFactor is now %4.1fn”, zoomFactor);
break;
case 27:
exit(0);
break;
default:
break;
}
}
Yukarıdaki kodda da görülebileceği üzere keyboard fonksiyonumuz 3 parametre almıştır bunlar:
unsigned char key : basılan tuşun asciikod karşılığı
int x: tuşa basıldığı sırada farenin x koordinatı
int y: tuşa basıldığı sıradaki farenin y koordinatı
dolayısıyla bu fonksiyonu tetikleyen olay klavyeden bir tuşa basılmasıdır. Bu basılma sırasında farenin konumu da fonksiyon tarafından yakalanmaktadır. Ayrıca basılan tuşun ascii kodu da ilk parametre olarak yakalandığı için basit bir switch / case yapısı içerisinde bu bilgi algılanabilir.
Yukarıdaki kodda son case için 27 kodu verilmiştir. Bu ascii olarak escape (esc.) tuşunun kodudur. Dolayısıyla escape tuşuna basıldığında exit(0) ile programdan çıkılması kodlanmıştır. Yine büyük ve küçük harflerin ascii kodları farklı olduğu için ayrı ayrı kodlanması gerekmektedir.
Ascii kodları tablosu için tıklayabilirsiniz.
Özel Klavye işlemleri
GLUT kütüphnanesi kullanılarak özel klavye işlemlerini de algılamak mümkündür. Temel olarak yön tuşları Fonksiyon tuşları ctrl, alt, shift gibi tuşlar bu türden tuşlardır. Bu tuşların karşılığı olan GLUT değişkenleri bulunur. Öncelikle özel klavye fonksiyonu tanımı aşağıdaki şekilde yapılmalıdır:
glutSpecialFunc(special_key);
Yukarıdaki bu tanımdan sonra aşağıdaki fonksiyon tanımı mümkündür:
GLvoid special_key(int key, int x, int y)
{
switch (key) {
case KEY_RIGHT:
printf(“sağ oka basıldı”);
break;
case KEY_LEFT:
printf(“sol oka basıldı”);
break;
case KEY_UP:
printf(“yukarı okula basıldı”);
break;
case KEY_DOWN:
printf(“aşağı oka basıldı”);
break;
default:
printf (” %d karakteri tanımlı değildir.n”, key);
break;
}
}
Yukarıdaki örnek kodda daha önce de açıklanan glutKeboardFunc ile aynı mantık izlenir ve tıklanan tuşun kodu ile birlikte tıklanma sırasındaki farenin konumu da alınır.
Özel klavye kodları için aşağıda bir tablo verilmiştir:
GLUT_KEY_F1 F1 fonksiyon tuşu. GLUT_KEY_F2 F2 fonksiyon tuşu. GLUT_KEY_F3 F3 fonksiyon tuşu. GLUT_KEY_F4 F4 fonksiyon tuşu. GLUT_KEY_F5 F5 fonksiyon tuşu. GLUT_KEY_F6 F6 fonksiyon tuşu. GLUT_KEY_F7 F7 fonksiyon tuşu. GLUT_KEY_F8 F8 fonksiyon tuşu. GLUT_KEY_F9 F9 fonksiyon tuşu. GLUT_KEY_F10 F10 fonksiyon tuşu. GLUT_KEY_F11 F11 fonksiyon tuşu. GLUT_KEY_F12 F12 fonksiyon tuşu. GLUT_KEY_LEFT Sol yön tuşu. GLUT_KEY_UP Yukarı yön tuşu. GLUT_KEY_RIGHT Sağ yön tuşu. GLUT_KEY_DOWN Aşağı yön tuşu. GLUT_KEY_PAGE_UP Page up yön tuşu. GLUT_KEY_PAGE_DOWN Page down yön tuşu. GLUT_KEY_HOME Home yön tuşu. GLUT_KEY_END End yön tuşu. GLUT_KEY_INSERT Inset yön tuşu.