2014-12-17 1 views
1

erfunc이라는 모듈이있는 Ergame이라는 엔진이 있습니다. 나는 NT/Windows 플랫폼에서이 스크립트를 썼고, 이제는 POSIX/Linux를 사용하고 있습니다. pygame에 대한 입력은 여러 번 명확하지 않기 때문에 IBM-STANDARD-US-PC와 ABNT2 키보드 레이아웃 (I've created several constants whose values are pygame-keycodes)을 명확하게 구분하고자했습니다. 나는 문제가있다.왜 파이 게임 키 코드가 특정 OS입니까?

예를 들어 미국 표준 레이아웃의 "ACUTE/TILDE"에 대한 키 코드는 96입니다. 여러 번 확인했습니다. 자, POSIX에서, 내가 확인할 때, 나는 39를 얻는다. (그리고 다른 모든 것에도 똑같이 적용된다.) 기본적으로 의미하는 것은 : 파이 게임 같은 파이 게임 이름을 언급하면. 그러나 키 코드를 직접 참조하면 OS에 따라 다릅니다 (기본적으로 내 엔진에서 OS를 감지하고 이에 따라 상수를 정의해야 함).

어쨌든 호기심이 생깁니다. . 왜?

+0

파이 게임 이름이 작동하면 왜 그냥 사용하지 않으시겠습니까? – BrenBarn

답변

1

내가 윈도우 나 맥 시스템의 입력에 대한 경험이 없다고 말하면서 서두르 겠지만, 리눅스 쪽에서는 무슨 일이 일어나고있는가?

키 이벤트는 일반적으로 프로그램에 도달하기 전에 3 단계 처리를 따릅니다. 키보드가 스캔 코드를 생성합니다. OS는 스캔 코드를 키 코드로 변환합니다. 키보드 맵은 키 코드를 기호로 변환합니다.

  • 스캔 코드는 키맵에 의해 정의 된 키 코드에 매핑 상징하는 하드웨어 특정하고
  • 키코는 일반적으로 /usr/include/linux/input.h
  • Keysyms에 정의 된 스캔 코드에 OS지도, 값입니다 키보드의 위치를 ​​나타냅니다. 당신은 스캔 코드/키 코드 구분이 약간 흐릿 (파이 게임은 래퍼 역할) SDL 들어 xmodmap -pke

로를 확인하고, 슈퍼 중요 수 없습니다. "스캔 코드"가 실제로 키 코드 일 때, 파이 게임의 event.scancode이 xev에 인쇄 된 "키 코드"값과 일치 함을 알 수 있습니다. SDL이 "sym"라고 부르는 파이 게임은 "키"를 호출하며 실제로는 SDL 관련 키 코드입니다. 키심은 이벤트의 "유니 코드"값으로 표현됩니다.

중요한 부분은 실제로 원시 스캔 코드를 얻지 못하기 때문에 키보드 의존성이 아닌 OS 의존성이 예상된다는 것입니다. 또한 원시 스캔 코드를 얻는 경우 스캔 코드가 문자가 아닌 위치에 따라 동일 할 것으로 기대할 수 있습니다. 따라서 모든 row-1 col-1 키는 키보드 레이아웃과 독립적으로 동일한 스캔 코드를 생성합니다.

OS 검사를 수행하는 데 지루할 수도 있고 거대한 상수 테이블을 가질 수도 있지만 일반적으로 어떻게 수행되는지는 알 수 있습니다. 좋은 소식은 SDL이이 작업을 수행하므로 실제로 pygame.K_ * 이름을 사용해야한다는 것입니다. 여러 자판 배열을 지원하는 것이 문제라면 각 레이아웃에 대해 하드 코딩 테이블 대신 입력 구성 메뉴를 추가하는 것이 좋습니다.

나는 더 읽기를위한 링크를 남기고 싶지만 실제로 링크 해야할지 잘 모르겠습니다. 지금은 SDL Input Guide으로 남겨 두겠습니다.

+1

아주 좋은 답변이었습니다. @ kalhartt, 정말 고마워요! 링크를 확인해 보겠습니다. "입력 구성 메뉴"를 추가하는 개념이 더 나은 방법이라는 사실이 분명해졌습니다 (그리고 그 이름도 사용합니다). 사실, 나는 그들이 변할지 몰랐다. 그래서 나는 키 코드를 선호했다. (예를 들어, 나는 단순히 그것들을 검사하고 "범위 상수"를 만드는 것만으로 일련의 키 코드에 접근 할 수 있었다. 그러나 나는 지금 본다. 고맙습니다! –