2010-04-14 3 views
2

너무 가까이 있습니다! XNA 게임 상태 관리 예제를 사용하여 here을 찾았으며 입력을 처리하는 방식을 수정하여 키를 지연 시키거나 입력 버퍼를 만들 수 있습니다.지연 키보드 입력 도움말

if (keyboardState.IsKeyDown(Keys.Left)) 
        movement.X -= 50; 

       if (keyboardState.IsKeyDown(Keys.Right)) 
       { 
        elapsedTime -= gameTime.ElapsedGameTime.TotalMilliseconds; 
        if (elapsedTime <= 0) 
        { 
         movement.X += 50; 
         elapsedTime = 10; 
        } 
       } 
       else 
       { 
        elapsedTime = 0; 
       } 

: 나는 이중라는 elapsedTime을 선언하고 HandleInput 방법에서는 동일한 0으로

을 설정 한 GameplayScreen.cs에서

나는에 Key.Right 버튼을 눌러 변경 한 의사 코드 :

오른쪽 화살표 키를 누르지 않으면 elapsedTime을 0으로 설정합니다.이 키를 누르면 elapsedTime 자체가 마지막 프레임 이후의 밀리 초를 뺀 값이됩니다. 차이가 0 이하인 경우 개체 50을 이동 한 다음 elapsedTime을 10 (지연)으로 설정합니다.

키를 누르고있는 경우 else를 통해 elapsedTime을 절대로 0으로 설정해서는 안됩니다. 대신, elapsedTime이 성공적으로 확인 된 후 10으로 설정된 후 elapsedTime은 TotalMilliseconds에 의해 감 해지고 있기 때문에 더 낮아지고 낮아집니다. 0에 도달하면 검사를 다시 통과하고 객체를 한 번 더 이동합니다.

문제는 프레스 당 개체를 한 번만 움직이지만 눌러 놓으면 작동하지 않는다는 것입니다. 아무도 이것에 대한 지식의 팁/예/비트의 모든 종류를 제공 할 수 있습니까? 미리 감사드립니다, 그것은 나를 미치게했습니다. 이론적으로 나는 이것이 확실히 작동 할 것이라고 생각했다. 그리드의

설명

생각할 때 나는 블록이 이동하는 방법에 대한 당신의 생각. 스크린을 가로 질러 유동적으로 움직이는 대신 폭 (sorta jumping)이 다음 위치로 이동합니다. 내가 열쇠를 누르고 있으면 화면을 가로 질러 경주한다. 나는이 전체 프로세스를 느리게하여 키를 잡으면 X 점 밀리 초 지연을 만들고 점프하고 폭만큼 이동합니다.

EDIT : gameTime.ElapsedGameTime.TotalMilliseconds가 항상 0을 반환합니다. 나는 이유를 모른다.

해결 : gameTime.ElapsedGameTime.TotalMilliseconds가 0을 (를) 반환하고 있습니다. 다른 곳으로 이동했습니다.

답변

1

발견 된 gameTime.ElapsedGameTime.TotalMilliseconds가 0을 반환했습니다. Update 메서드의 GameTime 매개 변수가 사용되었습니다. GameT라는 public double 변수를 설정합니다. GameT는 HandleInput 메서드에서 사용되었으며 유효한 시간을 반환했습니다. 가장 합법적 인 방법은 아니지만 지금은 효과가 있습니다.

0

문제는 엔터티에 어떤 동작을 적용 하시겠습니까?

  1. 당신이 (메뉴를 통해 이동하는 것처럼) 버튼을 누를 때, 당신은 각 업데이트는 현재에 대해 그것을 확인할 수 있도록 클래스 수준 변수에 KeyboardState를 저장할 한번 이동하려면 상태. 단추가 이전 상태로 유지되지 않았지만 지금 유지되는 경우에만 이동합니다. 그렇게하면 한 번만 작업을 트리거 할 수 있습니다.
  2. (오른쪽 화살표를 누를 때 오른쪽으로 스크롤하는 것처럼) 규칙적으로 부드럽게 이동하려면 운동 변수 (현재 하드 코드 된 값은 50)를 일정한 양 (조정 가능)으로 확장합니다. 따라서 movement.X += 50 * .05;과 같은 것입니다. 각 프레임이 이동하려는 속도와 일치 할 때까지 위와 아래로 조정할 수 있습니다.
+0

둘 다 아닙니다. 나는 한 번에 한 픽셀 씩 움직이고 싶지 않은 50 픽셀 너비의 블록을 가지고있다. 나는 매번 너비를 움직이기를 원한다. 문제는 내가 아주 빨리 움직이는 키를 누르고있는 것입니다. 타이머를 통해 입력을 지연시켜야합니다. .05와 같은 것을 사용하면 작동하지 않습니다. =/ 옵션 1을 원하지 않습니다. 매번 키를 눌러야하기 때문입니다. 옵션 2는 내가 만든 첫 번째 문장 때문에 작동하지 않습니다. – Stradigos

0

고정 게임 시간을 사용하는 경우에는 시간이 지체하지 않아도됩니다. "프레임"을 추적하고이를 기반으로 업데이트하는 변수를 유지할 수 있습니다.

int elapsedFrames = 10; //<- Set up somewhere higher than the function call 
if (keyboardState.IsKeyDown(Keys.Right)) 
{ 
    elapsedFrames++; 
    if (elapsedFrames >= 10) 
    { 
     movement.X += 50; 
     elapsedTime = 0; 
    } 
} 
else 
{ 
    elapsedTime = 10; 
} 

이렇게하면 gameTime을 다룰 필요가 없습니다.