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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir