문제

Windows에서 매우 잘 작동하는 MSVC ++와 함께 FPS 게임을 만들었습니다. 그러나 지금은 휴대용을 만들려고 노력하고 있습니다 (적어도 Linux와 Windows 버전을 만들고 싶습니다). 따라서 IDE를 Code :: 블록 및 WXWIDGET으로 변경하기로 결정했습니다. 그러나 가상 키 코드와 스캔 코드는 시스템마다 다릅니다.

이전에 나는 가상 키 코드가 동일한 운영 체제에서도 다를 수 있지만 다른 컴퓨터에서도 다를 수 있음을 경험했습니다 (캐릭터를 제어 할 수없는 버그 보고서 (Numlock State, LOL에 따라 농담이 아닌)에 대한 버그 보고서가 있습니다. 미덕 코드 대신 Scancodes를 사용하는 코드) (편집 : WXWIDGETS를 사용하면 Numpad의 Virty 및 스캔 코드는 Numlock State, Bang!)에 따라 다른 값을 갖습니다!)

이제 wxwidgets를 사용하면 wxkeyevent :: getRawkeyCode가 보이며 WM_Keydown의 LPARAM에서 이전에 얻은 코드는 다릅니다. 또한 GetRawkeyCode에서 Linux (Ubuntu)에서 완전히 다른 스캔 코드를 얻습니다.

글쎄, 나는 모든 키를 눌러 어떤 코드를 제공하는지 보면 내 스캔 코드 테이블을 만들 수 있지만 Ubuntu가 내 랩탑에서 실행하는 유일한 문제는 랩톱에 전체 키보드가 없지만 모두 필요합니다. 제어 설정이 작동합니다.

따라서 질문 : 동일한 키에 대해 동일한 코드를 얻는 표준 및 크로스 플랫폼 방법이 있습니까 (더 정확한 동일한 위치의 키)? (적어도 Windows와 Linux에서)

도움이 되었습니까?

해결책

아직 고려하지 않은 경우 사용할 수 있습니다. SDL.

다른 팁

이것은 FPS이기 때문에 사용하는 하위 레벨 그래픽 툴킷은 큰 차이를 만듭니다 (WXWIDGETS에서 3D 그래픽을 쓰지 않는다고 가정합니다). OpenGL을 사용하는 경우 무엇을 보았습니까? 과다 할수있다?

그만큼 Glutkeyboardfunc 그리고 glutspecialfunc 결합 glutgetModifiers 크로스 플랫폼 키보드 코드에 충분할 수 있으며 GLUT도 다른 입력 장치에도 사용할 수도 있습니다.

솔직히 말해서, 나는 이것이 WXWidget과 어떤 관련이있을 수 있는지 여전히 알지 못합니다.

내 의견은 WXWidget을 사용하여 빠르게 진행되는 3D 게임을 코딩하는 것이 완전히 잘못이라는 것입니다. "Hardcore"게임 개발에서는 편집기 및 변환기와 같은 지원 도구를 개발하는 데 사용해야합니다.

SDL 갈 길입니다. 그것은 매우 기본적으로 보일지 모르지만 일단 당신이 SDL의 부정한 신들에게 어린 아이들을 희생하기 시작하면 sdl_image (수많은 이미지 파일 형식을 읽는 데 적합합니다. sdl_mixer (기본 오디오를 읽고 재생하는 데 필요한 유일한 솔루션 -Ogg, wav, ...).

SDL을 더 이상 보지 마십시오. SDL_GFX를 사용하기 시작하면 2D 그래픽 지원조차 좋습니다. SDL은 처음에는 기본적으로 보일 수 있지만 일단 주변에 구축 된 모든 추가 라이브러리를 계산하면 주변의 래퍼 몇 개를 코딩하면 SDL이 필수품과 고급 사용의 용이성 사이의 완벽한 균형을 볼 수 있습니다.

SDL이 너무 굉장하다고 생각하기 때문에 어떤 식 으로든 기꺼이 도와 드리겠습니다.

나는 당신이 여기에서보고있는 것을 오해하고 있지만 원시 키 코드가 반환되었습니다 하드웨어, OS, 구성 및 플랫폼 차이를 초래하므로 가상 키 코드가 반환되었습니다 a 주요 이벤트.

편집 : 아마도 wxwidgets 단지 그것을 올바르게 처리하지 않습니다 (불안한). Numlock 키의 문제는 원시 스캔 코드를 사용 하여이 문제를 해결하도록 "강제"하는 것입니다.

그렇다면, 당신은 당신이 한 일을 버릴 필요가 없지만 추가하는 경우 SDL 입력 물건을 위해서는 반환하는 전화를 찾을 수 있습니다. SDL_KEYSYM 하드웨어 스캔 코드 ( "고정"에 대해 아무것도 할 수 없음)를 반환하지 말고 유니 코드 문자와 가상 기호로 매핑하십시오. 바라건대 그들의 통화에는이 numlock 수정 자 문제가 없기를 바랍니다.

SDL을 사용하지 않으면 권장합니다. SFML- 간단하고 빠른 멀티미디어 라이브러리. 다중 플랫폼이며 사용하기가 간단합니다. 예를 들어 튜토리얼 섹션:

bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

입력이있는 곳

const sf::Input& Input = App.GetInput();

거기 있습니다 몇 가지 적응증 SFML은 SDL보다 빠르지 만 SDL보다 사용량을 좋아하기 때문에 빠르고 휴대용 코드를 채찍질하는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top