HID는 플레이어가 게임에 입력을 보낼 수 있게 해주는 장치(키보드, 조이스틱 등)이다.

8.2 HID와 인터페이스

게임 소프트웨어가 HID로부터의 입력을 읽어오고 출력을 보내는 방법은 여러가지가 있다.

 

8.2.1 폴링

ㄴ 하드웨어를 주기적으로 폴링하는 방식으로 입력을 읽어온다.(하드웨어의 상태를 보통 게임 루프당 한 번씩 읽는다)

ㄴ 하드웨어 레지스터 혹은 메모리 맵 I/O 포트를 직접 읽는다.

 

8.2.2 인터럽트 

ㄴ 컨트롤러의 상태가 변할 때만 게임 엔진에 데이터를 보낸다. 

ㄴ HID가 인터럽트를 하드웨어에 보내 메인 프로그램을 잠시 정지시키고 장치의 상태를 읽도록 만든다.

 

8.2.3 무선 장치

ㄴ 레지스터나 메모리 맵 I/O 포트를 통해 데이터를 읽고 쓸 수 없다.

ㄴ 블루투스 프로토콜을 통해 장치와 교신해야 한다. 게임 엔진의 메인 루프와는 별도로 마련된 스레드에서 처리하는 경우가 일반적이며, 그렇지 않은 경우라면 적어도 메인 루프에서 호출할 수 있게 비교적 단순한 인터페이스를 통해 캡슐화한다.

 

8.3 입력의 종류

8.3.1 디지털 버튼

ㄴ 버튼의 눌린 상태와 텐 상태를 비트 하나 (0과 1)로 표현하는 경우가 많기 때문에, 하나의 정수 타입 변수에 모든 버튼의 상태를 저장할 수 있다. 개별 버튼의 상태를 알고 싶으면 버튼의 비트 마스크 값과 AND 연산한 후 값이 0이 아닌지 보면 된다.

 

8.3.2 아날로그 축과 아날로그 버튼

엑스박스 360의 게임패드를 예시로 들어을 때

조이스틱의 아날로그 스틱(아날로그 축)의 입력을 x축 y축 좌표값으로 각각 16비트 정수에 저장하고

아날로그 버튼(누르는 세기에 따라 값이 다른 버튼)은 8비트 정수에 저장한다.

 

8.3.4 가속도계

듀얼쇼크에는 가속도계(accelerometers)라 불리는 가속 감지 센서가 있는데 x, y, z축 방향의 가속도를 3G까지 측정할 수 있고 각 축당 8비트 정수에 저장한다.

 

8.4 출력의 종류

여기에서는 HID가 플레이어에게 주는 출력을 말한다.

8.4.1 럼블(진동)

ㄴ 하나 이상의 모터를 사용하고 모터의 속더를 사용하여 진동을 낸다.

 

8.4.2 포스 피드백

ㄴ 모터를 통해 조작하려는 방향에 살짝 저항하는 힘을 가하는 것

 

8.4.3 오디오

ㄴ 컨트롤러에 작은 스피커가 달려 있다.

 

8.5 게임 엔진의 HID 시스템

HID와 게임 사이에 최소한 하나 이상의 간접 지정 레벨을 두어 다양한 방식으로 HID 입력을 추상화한다.

8.5.2 데드 존

아날로그 축의 경우 가만히 두면 0의 입력값으로 취급해야 하는데 아날로그 장비이므로 잡음에 의해 완벽한 0이 아닐 수 있다. 데드 존을 두어 데드 존 안에 포함되는 입력을 모두 0으로 처리하는 방법을 사용한다. 데드 존의 크기는 잡음을 처리할 수있을 정도로는 넓어야 하지만 조작감이 둔하다고 느낄 정도로 커서는 안 된다.

 

8.5.3 아날로그 신호 필터링

데드존 밖으로 오는 잡음을 처리하기 위해 원본 입력을 게임에 사용하기 전에 저역 통과 필터를 거치게 하는 방법을 사용한다.

지난 프레임의 필터에 거친 입력 값과 현재의 원본 입력 값을 결합하는 방법

지난 3프레임 동안의 입력 데이터의 이동 평균을 사용하는 방법

 

8.5.4 입력 이벤트 감지

8.5.4.1 버튼 업과 버튼 다운

지난 프레임에서 저장한 버튼 상태 값과 현재 프레임에서 관찰한 상태 값을 비교하여 값이 다른 경우 이벤트가 발생했다는 것을 알 수 있다. 

이전 프레임에서의 버튼 상태를 저장하고 있어야 한다.

 

8.5.4.2 코드(chord)

동시에 눌러서 게임에 특수한 행동을 하도록 유도하는 버튼 그룹을 코드라고 한다.

 

ㄴ 개별 버튼의 다운을 감지했을 때 코드의 다른 버튼이 동시에 눌리지 않았는지 검사하는 방식으로 구현한다.

ㄴ 사람은 기계가 아니기 때문에 코드의 버튼을 누를 때 다소의 시간차가 있을 수 있다는 점도 고려해야 한다. i 프레임에서 코드의 일부를 감지하고, 다음 i + N 프레임에서 나머지 코드를 감지하는 경우도 처리할 수 있어야 한다.

 

8.5.4.3 시퀀스와 제스처 감지

격투 게임이나 브롤러 게임에서는 일련의 버튼 순서를 감지하는 경우가 있다.

 

짧은 시간 안에 정해진 순서의 버튼을 입력해야만 올바른 동작이 되는 제스처를 감지하기 위해서는 짧은 시간동안 플레이어가 수행한 HID 조작을 기록하는 방법을 사용한다.

제스처를 이루는 첫 입력이 들어올 때 기록 버퍼에 입력 값과 시각을 기록하고, 그 후 이어지는 입력이 감지되는 경우 직전 입력의 시각과 현재 입력의 시각을 비교한다. 그 차이가 허용된 시간 범위 내인 경우 현재 입력도 기록 버퍼에 저장한다.

 

제한 시간 내에 전체 시퀀스의 입력이 모두 완료된 경우 이벤트를 발생해 게임 엔진에 제스처가 일어났음을 알린다. 중간에 올바르지 않은 입력이 들어오거나 제스처 코드가 제한 시간을 넘어서 들어온 경우에는 기록 버퍼를 전부 비운다.

 

8.5.7 입력 재배치

간접 지정 레벨을 둠으로써 사용자가 모든 키를 재지정할 수 있도록 한다.

 

8.5.8 상황 기반 컨트롤

ㄴ 게임 내에서 하나의 키로 많은 처리를 할 경우 (상호작용 버튼)에는 플레이어가 어떤 상태에 있느냐에 따라 다른 처리를 할 수 있도록 해야 한다. 어떤 상태에 있는지를 정하는 것이 까다롭다.

 

8.5.9 입력 무시

ㄴ 플레이어가 인게임 시네마틱을 보고 있는 경우에는 캐릭터를 조작할 수 없게 해야한다.

+ Recent posts