2016-10-05 3 views
1

MonoGame으로 타일 기반 그래픽 방식의 게임을 만들고 있습니다. 입력을 처리 할 때 플레이어가 너무 빠르게 움직입니다. 별도의 개별 키 누르기로 플레이어를 움직여도 응용 프로그램이 매우 재미있게 재생되지는 않습니다.MonoGame 속도를 늦추는 방법

어떻게 게임 루프 사이에 시간을 추가 할 수 있습니까? Thread.Sleep을 사용하면 전체 프로그램이 멈추고 입력을 처리하지 못합니다.

+0

트릭은 게임 루프 반복 사이에 지연을 추가하는 대신 루프 실행 사이의 시간을 측정하고 그에 따라 속도/속도, 가속도 등과 같은 시간 종속적 값을 조정하는 것입니다. – Dai

답변

0

여기 내가 결국하기로 결심했다.

게임 개체를 구성 요소로 분리하고 이동 개체라고합니다. 움직임은 타일 기반이기 때문에 속도 나 벡터 등을 사용할 수 없습니다.

코드가 단순화되었으므로 여기에 모든 것을 포함하지 않았습니다.

public class Movement 
{ 
    // define a movement interval and store the elapsed time between moves 
    private double interval, elapsedTime; 

    public Movement(double interval) 
    { 
     this.interval = interval; 
    } 

    // called when arrow keys are pressed (player) 
    public void Move(Direction dir) 
    { 
     if(elapsedTime > interval) 
     { 
      // move 
     } 
    } 

    // called once per frame from the main class Update method 
    public void Update(GameTime gameTime) 
    { 
     if(elapsedTime > interval) 
      elapsedTime -= interval; 

     // add milliseconds elapsed during the frame to elapsedTime 
     elapsedTime += gameTime.ElapsedGameTime.TotalMilliseconds; 
    } 
} 

public enum Direction 
{ 
    LEFT, 
    RIGHT, 
    UP, 
    DOWN 
} 
0

매우 간단한 해결책은 MonoGame이 기본으로 설정 한 고정 업데이트 속도를 줄이는 것입니다. 이렇게하면 입력에 응답 성이 떨어지며 일반적으로 바람직하지 않습니다.

더 나은 해결 방법은 마지막 업데이트 이후 경과 된 시간을 계산하고 그에 따라 운동을 조정하는 것입니다. 또한 더 많은 기능을 더 쉽게 만들 수있는 추가 이점이 있습니다. 예를 들어 객체에 대한 중요성을 부여하여 속도의 정수로 추가 할 수 있고 마지막 프레임을 버퍼링하지 않고 중간 위치를 외삽하지 않고도 프레임 속도를 확장 할 수 있습니다. .

1

일반적인 방법은 "초당 단위"로 모든 속도를 정의하는 것입니다. 따라서 플레이어는 초당 64 픽셀 (또는 선택한 속도)의 속도로 움직입니다. 각 프레임, MonoGame은 Update을 호출하고 GameTime 인스턴스를 마지막 프레임 이후로 경과 한 시간을 전달합니다. 당신이 원하는 것은 움직임 속도에 GameTime.ElapsedGameTime.TotalSeconds을 곱하는 것입니다. 따라서 마지막 프레임 이후 1/3 초가 지났다면 64 * .75을 사용하여 48을 얻습니다. 이는 버튼을 누르고 있으면 해당 프레임으로 이동해야하는 픽셀 수입니다.

"초당 단위"로 모든 것을 정의하면 프레임 속도의 속도 또는 속도에 관계없이 속도를 일관되게 유지할 수 있습니다. 이것은 운동 속도 (픽셀/미터/초), 선회율 (초당도), 건강 재생 (초당 HP) 등을 위해 작동합니다. MonoGame을 사용하면 모든 기본 단위 클래스가 Vector2Vector3은 정확하게 이러한 목적으로 오버로드 된 곱셈 연산자를 사용합니다.

관련 문제