>

스프라이트가 왼쪽에서 오른쪽으로 가로로 움직입니다. 각 반복마다 속도를 낮추고 싶습니다. 이것은 정상적으로 작동하며 스프라이트는 어느 시점에서 멈추지 만 프레임 속도에 따라 항상 멈추지는 않습니다. 같은 장소에서. 내 코드에 어떤 문제가 있습니까?

...
Vector2 Position;
Vector2 Speed;
...
Speed.X = 50;
...
public override void Update(GameTime theGameTime)
{
    float time = (float) theGameTime.ElapsedGameTime.TotalSeconds;
    Position += Speed * time;
    Speed.X-=10; // Reduce speed for next iteration
    if ( Speed.X < 0 ) Speed.X = 0;
}

나도 노력했다

Speed.X-=10 * time;

하지만 작동하지 않았습니다.

  • 답변 # 1

    문제는이 줄에 있습니다 :

    Speed.X-=10;
    
    

    이렇게하면 속도가 일정하게 감소하므로 프레임 속도가 낮을수록 같은 시간 동안 속도 손실이 줄어 듭니다. 두 번째 시도에서 이것을 터치합니다 :

    Speed.X-=10 * time;
    
    

    이 반복으로 캐릭터가 실제로 5 초 후에 멈출 것이지만 프레임 속도가 낮 으면 더 높은 속도로 더 많은 시간을 보낼 수 있습니다. 예를 들어, 10 FPS 프레임 속도는 10, 9, 8 등의 속도로 각각 0.1 초를 소비하게합니다. 2 FPS 프레임 속도는 10 속도로 0.5 초, 5 속도로 0.5 초를 소비합니다.

    필요한 것은 프레임의 평균 속도를 가져 와서 주어진 프레임 시간 동안 해당 속도를 따라 플레이어를 이동시키는 것입니다. C #에 익숙하지 않으므로 전체적으로 적절한 구문이거나 아닐 수있는 의사 코드를 제공합니다.

    float time = (float) theGameTime.ElapsedGameTime.TotalSeconds;
    float startFrameSpeed = Speed.X;
    float endFrameSpeed = Speed.X - (10 * time);
    float displacement = 0;
    if(endFramespeed < 0) {
        //This is a problem because the player ends the frame with negative speed and that will throw off our average. We need to calculate the displacement a bit differently in this instance.
        //If you change the speed change from 10 units per second, you'll need to replace these tens with the new value. I would thus recommend storing the step in a variable for quick adjustment later.
        float timeSpentWithNegativeSpeed = -(endFrameSpeed / 10); //Get a positive value for time.
        displacement = 10 * timeSpentWithNegativeSpeed;
    }
    //Displace the player along the average speed throughout the frame.
    Position += (startFrameSpeed + endFrameSpeed) / 2 + displacement;
    Speed.X = endFrameSpeed;
    if(Speed.X < 0) Speed.X = 0;
    
    

관련 자료

  • 이전 opengl - 매끄러운 큐브 맵 노이즈 텍스처를 만드는 방법은 무엇입니까?
  • 다음 game mechanics - 내 전투 시스템을 개선하는 방법?