目次

004 キーボード入力

概要

キーボードの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;
}