====== 004 キーボード入力 ====== {{:wiki:opengl:tips:opengl_inputkeyboard.png?200|}} ===== 概要 ===== キーボードのR、G、B キーを押すと画面の色が変わる様にします。 ==== GLUTソースコード ==== KeyboardCallBack 関数を登録して、キーボードの入力状態を得ます。 // ディスプレイコールバック void displayCallBack() { // 画面クリア。 glClear( GL_COLOR_BUFFER_BIT ); // ダブルバッファ交換。 glutSwapBuffers(); } // キーボード入力用コールバック void KeyboardCallBack( unsigned char _key, int _x, int _y ) { switch( _key ) { case 'r': glClearColor( 1.0, 0.0, 0.0, 1.0 ); break; case 'g': glClearColor( 0.0, 1.0, 0.0, 1.0 ); break; case 'b': glClearColor( 0.0, 0.0, 1.0, 1.0 ); break; case '\033': // ESC glClearColor( 1.0, 1.0, 1.0, 1.0 ); break; default: break; } // ディスプレイコールバック呼び出し。 glutPostRedisplay(); } // メイン int main( int argc, char *argv[] ) { // GLUTの初期化 glutInit( &argc, argv ); // ウィンドウの位置を指定。 glutInitWindowPosition( 100, 100 ); // ウインドウサイズ指定 glutInitWindowSize( 640, 480 ); // ウインドウの表示モード指定 glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA ); // ウインドウ生成 glutCreateWindow( argv[0] ); // 画面の初期色設定。 glClearColor( 1.0, 1.0, 1.0, 1.0 ); // コールバック関数の登録。 glutDisplayFunc( displayCallBack ); // ディスプレイ。 glutKeyboardFunc( KeyboardCallBack ); // キーボード // メインループ glutMainLoop(); return 0; } ==== Win32API版ソースコード ==== GLUTでは5キー以上の同時入力を受け付けないので、Windows環境であればWindowsAPI を利用した方が良い。 // アイドル時用コールバック void IdleCallBack() { if( GetAsyncKeyState('R') & 0x8000 ) { glClearColor( 1.0, 0.0, 0.0, 1.0 ); } else if( GetAsyncKeyState('G') & 0x8000 ) { glClearColor( 0.0, 1.0, 0.0, 1.0 ); } else if( GetAsyncKeyState('B') & 0x8000 ) { glClearColor( 0.0, 0.0, 1.0, 1.0 ); } else if( GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) { glClearColor( 1.0, 1.0, 1.0, 1.0 ); } // ディスプレイコールバック呼び出し。 glutPostRedisplay(); } // メイン int main( int argc, char *argv[] ) { // GLUTの初期化 glutInit( &argc, argv ); // ウィンドウの位置を指定。 glutInitWindowPosition( 100, 100 ); // ウインドウサイズ指定 glutInitWindowSize( 640, 480 ); // ウインドウの表示モード指定 glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA ); // ウインドウ生成 glutCreateWindow( argv[0] ); // 画面の初期色設定。 glClearColor( 1.0, 1.0, 1.0, 1.0 ); // コールバック関数の登録。 glutDisplayFunc( displayCallBack ); // ディスプレイ。 glutIdleFunc( IdleCallBack ); // アイドル。 // メインループ glutMainLoop(); return 0; }