====== 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;
}