키 누름시 지연 제거


11

나는 간단한 게임을 만들고 있는데, 내가 겪었던 문제 중 하나는 키를 계속 누를 때 성가신 지연입니다.

기본적으로 예를 들어 (매우 오랫동안) Up누르면 객체가 1 단위 위로 움직이고 움직이지 않고 (약 1 초 동안) 지연없이 1 단위 위로 계속 움직입니다.

현재 이것을 사용하여 객체 (SDL2)를 옮깁니다.

while (SDL_PollEvent(&event))
{
    switch (event.type)
    {
    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {
        case SDLK_UP:
            //Move object 1 unit up
            break;
        //Other unrelated things omitted
        }
        break;
    //Omitted other cases
    }
}

내가 원하는 것은 지연을 제거하여 객체가 즉시 Up매우 빠르게 움직일 수 있도록하는 것 입니다. 이것을 할 수있는 방법이 있습니까?

답변:


19

키 다운 이벤트가 발생하기를 기다리면 OS가 제어하는 ​​키 이벤트 반복 속도 (및 사용자가 스스로 지정할 수있는)에 영향을 줄 수 있습니다.

대신, SDL_GetKeyboardState게임 업데이트 루프의 상단 ( 이벤트가 들어 왔는지 여부에 관계없이 모든 프레임에서 발생하는 업데이트 부분) 을 호출 하여 키보드의 상태를 확인하고 확인하십시오. 개별 프레임 동안 키가 다운되었거나 아닌지.


창 메시지를 듣는 것이 낫지 않습니까? 폴링을 사용하면 때로는 매우 짧은 키 누름이 누락되고 프레임 속도가 낮을 ​​때이 문제가 악화됩니다.
Roy T.

@RoyT. 그것은 실제로 게임과 키로 트리거하려는 행동의 종류에 달려 있습니다. 키 누르기가 대화 상자를 닫는 "액션"키와 같은 일회성 작업 인 경우 메시지 큐가 올바른 접근 방식입니다. 원 자성 이벤트를 수신하려고합니다. -반면에 키 상태가 "이동"키와 같은 진행 상태를 나타내는 경우 일반적으로 논리는 while key UP is down move 30 units per second-초당 1 회 이상 (보통 둘 이상의 프레임) 사이에 측정 가능한 시간이있을 때만 의미가 있습니다.
Falco

@RoyT. 메시지를들을 수도 있고 자신의 키보드 상태 배열을 업데이트하는 데 사용할 수도 있습니다. 나는이 접근 방식을 간단하게 제안했다. 그래도 다른 대답을 쓸 수 있습니다. 중요한 부분은 키가 계속 다운 되어 있는지 확인하기 위해 OS 메시지에 의존하지 않는 것입니다. OS 키 반복 속도와 연결되어 있기 때문입니다.

그리고 프레임 단위로 비디오 프레임이 아니라 게임 틱을 의미합니까? 렌더 루프에서 게임 로직을 편집하고 인코딩하지 않기 때문입니다. :-)
corsiKa

@ JoshPetrie 완전히 동의합니다. '압박'대신 '클릭'을 확인 해야하는 경우이 작은 경고를 지적하고 싶었습니다. :)
Roy T.

10

다른 방법 (Josh의 접근 방식도 훌륭합니다!)은 boolean on을 설정 SDL_KEYDOWN하고 반복되는 모든 주요 이벤트를 무시하는 것입니다. repeat키 이벤트 의 멤버를 확인하여 수행 할 수 있습니다 .

그럼 당신은 자신의 타이머를 구현할 수 있습니다, 그것은 멋진 일이 아니며, 자신의 키 반복을 구현할 수 있습니다. 타이머에서 직접 작업을 트리거하거나 SDL_KEYDOWN이벤트를 생성 하고 솔루션을 통합 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.