C++ / OpenGL [ 08 – Menu ]

Menu ve AltMenuler

glutCreateMenu(void (*func)(int value));
//menumuzu olusturmamiz icin gereken fonksiyon
glutAddMenuEntry(char *name, int value);
//menumuze deger girmemizi saglayan fonksiyon
glutAddSubMenu(char *name, int menu);
//alt menu olusturan fonksiyon
glutAttachMenu(int button);
//ve tusumuza menuyu dahil eden fonksiyonumuz.

Menumuzu mausun istenen tusuna ekliyebiliriz.
GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, ve GLUT_RIGHT_BUTTON.

simdi programimizi yazmaya basliyabiliriz.
ders sonunda programimizin goruntusu bu sekilde olacaktir;

menuders08

oncelikle kutuphanelerimizi ve degerlerimizi belirtiyoruz.

[c language=”++”]
#include <windows.h>
#include <glut.h>

static int pencere;
static int menu_id;
static int altmenu_id;
int value = 0;
[/c]

Yukarida belirttigimiz degerlerin static int olmasinin sebebini ornekleyerek gostermemiz gerekirse;

static int Deger;
int Deger = 0;

penceremizi ve menu lerimizi bir deger altinda tutmamizin sebebi
bazi islemlerimizi daha rahat yapabilmemiz ve ayni yapidaki baska fonksiyonlarla
karismamasi.

devam ediyoruz;

[c language=”++”]
void menu(int say){
if(say == 0){
glutDestroyWindow(pencere);
exit(0);
}else{
value = say;
}
glutPostRedisplay();
}
[/c]

Yukarida yazdigimiz bu fonksiyonun amaci;
Eger secim “0” olursa pencereyi kapat ve cik
eger baska bir secim olursa ayni secimle devam et.
Kisaca “cikis” secenegi icin bir fonksiyonumuz.
devam ediyoruz;

[c language=”++”]
void menuolustur(void){

altmenu_id = glutCreateMenu(menu);
glutAddMenuEntry("Kure", 2);
glutAddMenuEntry("Koni", 3);
glutAddMenuEntry("Caydanlik", 5);

menu_id = glutCreateMenu(menu);
glutAddMenuEntry("Temizle", 1);
glutAddSubMenu("Ciz", altmenu_id);
glutAddMenuEntry("Cikis", 0);

glutAttachMenu(GLUT_RIGHT_BUTTON);
}
[/c]

Yukarida menumuzu sonunda olusturduk
menumuze ve alt menumuze bir deger atadik
ve
glutAddMenuEntry(“”, deger); // methoduyla menumuzun elemanlarini olusturduk

goruldugu gibi alt menumuz icin kure,koni,caydanlik olmak uzere 3 secenek olusturduk.

Ana menumuz icin ise Temizle,ciz[alt menu],cikis olarak 3 secenek olusturduk.
Ana menumuzden secilen ciz secenegi bizi alt menuye bagladi.

en son olarak menumuzu Mousumuzun sag tusuna entegre ettik.
ve displayimizi olusturuyoruz;

[c language=”++”]
void display(void){
glClear(GL_COLOR_BUFFER_BIT); if(value == 1){
glutPostRedisplay();
}else if(value == 2){
glPushMatrix();
glColor3d(1.0, 0.0, 0.0);
glutWireSphere(0.5, 50, 50);
glPopMatrix();
}else if(value == 3){
glPushMatrix();
glColor3d(0.0, 1.0, 0.0);
glRotated(65, -1.0, 0.0, 0.0);
glutWireCone(0.5, 1.0, 50, 50);
glPopMatrix();
}else if(value == 5){
glPushMatrix();
glColor3d(1.0, 0.0, 1.0);
glutSolidTeapot(0.5);
glPopMatrix();
}
glFlush();
}
[/c]

Yukaridaki fonksiyon goruldugu uzere bizim ana cizim fonksiyonumuz (display)
burada if else sayesinde secilen degere gore cizim yapmamizi ayarliyoruz.

Eger secilen deger(value) = 1 ise
glutPostRedisplay(); // yani ekrani tazele ve birsey cizme
Eger secilen deger = 2 ise kure ciz
Burada deginmemiz gereken bir baska detay;

glutWireSphere(0.5, 50, 50); // wire olmasindan dolayi kati cisim yerine tellerden olusmakta.eger
glutSolidSphere(0.5, 50, 50); yazilmis olsaydi cismimiz kati gozukecekti.

ve bu sekilde diger degerlerinde karsiligi ataniyor.
en son olarak ana fonksiyonumuzu dahil ediyoruz.

[c language=”++”]
//Ana fonksiyonumuz
int main(int argc, char **argv){ glutInit(&amp;argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,100);
pencere = glutCreateWindow("Menu ve Alt Menu");
//menumuzu olusturuyoruz ve ana fonksiyona dahil ediyoruz
menuolustur();

//Arkaplani siyaha boyadik
glClearColor(0.0,0.0,0.0,0.0);
//display fonksiyonumuz
glutDisplayFunc(display);

//
glutMainLoop();
return EXIT_SUCCESS;
}
[/c]

Ders sonunda olusturdugumuz projenin .cpp kaynak dosyasini buradan indirebilirsiniz.

ders08

Leave a Reply

Your email address will not be published. Required fields are marked *