キーボード入力にはglutKeyboardFunc()を使う
#include#include #include #define MAXPOINTS 100 /* 記憶する点の数 */ GLint point[MAXPOINTS][2]; /* 座標を記憶する配列 */ int pointnum = 0; /* 記憶した座標の数 */ int rubberband = 0; /* ラバーバンドの消去 */ void display(void){ int i; glClear(GL_COLOR_BUFFER_BIT); if(pointnum > 1){ glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); for (i = 0; i < pointnum; ++i){ glVertex2iv(point[i]); } glEnd(); } glFlush(); } void resize(int w, int h){ glViewport(0, 0, w, h); glLoadIdentity(); glOrtho(-0.5, (GLdouble)w - 0.5, (GLdouble)h - 0.5, -0.5, -1.0, 1.0); } void mouse(int button, int state, int x, int y){ switch(button){ case GLUT_LEFT_BUTTON: point[pointnum][0] = x; point[pointnum][1] = y; if(state == GLUT_UP){ glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); glVertex2iv(point[pointnum - 1]); glVertex2iv(point[pointnum]); glEnd(); glFlush(); rubberband = 0; } else { } if(pointnum < MAXPOINTS - 1) ++pointnum; break; case GLUT_MIDDLE_BUTTON: break; case GLUT_RIGHT_BUTTON: break; default: break; } } void motion(int x, int y){ static GLint savepoint[2]; /* 論理演算機能 ON */ glEnable(GL_COLOR_LOGIC_OP); // 引数capに指定した機能を使用可能にする。 glLogicOp(GL_INVERT); // 論理演算のタイプを指定 glBegin(GL_LINES); if(rubberband){ glVertex2iv(point[pointnum - 1]); glVertex2iv(savepoint); } /* 新しいラバーバンドを描く */ glVertex2iv(point[pointnum - 1]); glVertex2i(x, y); glEnd(); glFlush(); /* 論理演算機能 OFF */ glLogicOp(GL_COPY); glDisable(GL_COLOR_LOGIC_OP); /* 今描いたラバーバンドの端点を保存 */ savepoint[0] = x; savepoint[1] = y; /* 今描いたラバーバンドは次のタイミングで消す*/ rubberband = 1; } void keyboard(unsigned char key, int x, int y){ switch(key){ case 'q': case 'Q': case '\033': /* '\033'はESCのASCIIコード */ exit(0); default: break; } } void init(void){ glClearColor(1.0, 1.0, 1.0, 1.0); } int main(int argc, char *argv[]){ glutInitWindowPosition(100, 100); glutInitWindowSize(320, 240); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); glutMouseFunc(mouse); glutMotionFunc(motion); // マウスを動かした時に実行する引数を与える glutKeyboardFunc(keyboard); init(); glutMainLoop(); return 0; }
exit(0)で終了する。
なるほど、viなどもq, Q, \033でexit(0)の処理を入れているのか。