2013-08-28 1 views
0

키보드 입력 처리를 위해 Glut을 사용 했으므로 오랜 시간이 걸렸지 만 키보드 콜백 함수가 수정되지 않은 Key 매개 변수를 제공 한 것처럼 느껴집니다.glutKeyboardFunc 콜백 함수에서 수정되지 않은 키보드 입력 찾기

즉, "r"을 누르면 소문자 "r"문자가 반환되고 SHIFT + "r"을 누르면 여전히 소문자 "r"이 반환되고 대문자 "R"는 반환되지 않습니다. 이는 변경자 키 (SHIFT, CONTROL, ALT)를 사용하여 실제로 콜백 함수에 전송 된 키를 수정하기 때문에 지금은 그렇지 않습니다 (아마도 절대로 없었을 것입니다). 나는 원시를 얻는 방법을 찾으려고 노력했다. 수정되지 않은 값이 있었지만 이후에는 행운이 없었다.

콜백 함수에서 수정되지 않은 키보드 값에 액세스하는 방법이 있습니까? 아니면 올바른 키 값을 얻기 위해 수동으로 수정을 되돌릴 방법을 찾아야합니까?

glutKeyboardFunc(keyDown); 

...

void Game::keyDown(unsigned char key, int mouseX, int mouseY) 
{ 
    switch (key) 
    { 
    case 'r': 
     { 
      cout<<"Called when 'r' is pressed"<<endl; 
      cout<<"Is NOT called when SHIFT is the modifier"<<endl; 
      break; 
     } 
    case 'R': 
     { 
      cout<<"Called ONLY when 'r' is pressed with SHIFT"<<endl; 
      cout<<"Is NOT called when 'r' is pressed on its own"<<endl; 
      break; 
     } 
    case 18: 
     { 
      cout<<"Called ONLY when 'r' is pressed with CONTROL"<<endl; 
      cout<<"Is NOT called when 'r' is pressed on its own"<<endl; 
      break; 
     } 
    } 
} 

어떤 도움이나 조언이 크게 감상 할 수있다. 당신은 정수로 결과를 할당하고 다음으로 확인할 수 있습니다

int glutGetModifiers(void); 

: :이 기능을 찾고 있습니다

답변

0

약간의 예를

GLUT_ACTIVE_SHIFT 
GLUT_ACTIVE_CTRL 
GLUT_ACTIVE_ALT 

int modifier = glutGetModifiers(); 
    if (modifier == GLUT_ACTIVE_CTRL) 
     //code 
    else 
     //code 
} 

이 함수는 키보드 나 마우스를 처리하는 함수 내에서만 호출되어야합니다. 이벤트를 넣으십시오.

+0

이전에이 방법을 사용했지만이 특정 상황에서는 문제가 있습니다. ascii 테이블에서 'r'= 114이고 SHIFT를 잡고 82를 얻으면 '이론적으로는 지 시프트가 주어진 문자를 32만큼 수정하고 뒤로 작업 할 수 있습니다. 하지만 둘 사이의 차이는 (48 - 41 =) 7이기 때문에 '0'과 ')'와 같이 작동하지 않습니다. '1'과 '!' 7이 아니라 17! 결국, 각 특정 시나리오에 대해 수십 개의 'if'구문을 사용해야하는데,이 시나리오는 다소 중복 될 수 있습니다. 사용하려는 각각의 ascii 값에 대해 대/소문자를 구분할 수 있기 때문입니다. – Zipiocon