2022年3月28日 星期一

學習筆記 week06

這週會新增鍵盤的相關程式

新增一個OpenGL專案,將main.cpp的程式碼全刪掉,換成以下的:
#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
    printf("button %c at %d,%d\n",key,x,y);
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_1");

    glutDisplayFunc( display );
    glutKeyboardFunc(keyboard);

    glutMainLoop();
    return 0;
}

本週的重點是keyboard:
紅: 事件宣告,跟之前的glutDisplayFunc(display); 及glutMotionFunc(mouse);很相似。
綠: 此座標是以視窗最左上角為基準。
藍: <stdio.h>可以每個變數現在的數值顯示在視窗裡面。很適合拿來偵錯。

順便一提,按下按鍵的符號請用%c顯示,如果是%d則會顯示他的ASCII碼。(A=65,B=66,C=67,a=97,b=98,c=99...)


如果想要同使使用鍵盤,滑鼠等功能,就需要宣告多項函式。
void keyboard(unsigned char key,int x,int y)
{
    
}
void mouse(int button, int state, int x, int y)
{
    
}
void motion(int x, int y)
{
    
}

#include <GL/glut.h>
#include <stdio.h>
float shapesize=0.3;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(1,1,0);
        glutSolidTeapot(shapesize);
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
    printf("button %c at %d,%d\n",key,x,y);
}
void mouse(int button, int state, int x, int y)
{
    if(button==3&&state==0)shapesize+=0.1;
    else if(button==4&&state==0)shapesize-=0.1;
    display();
    printf("button %d %d at %d,%d\n",button,state,x,y);
}
void motion(int x, int y)
{

}
int main(int argc, char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_1");

    glutDisplayFunc( display );
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();
    return 0;
}









沒有留言:

張貼留言