레이스 카 게임, 더 빠른 컴퓨터에서 더 빨리 움직이는 자동차

StackOverflow https://stackoverflow.com/questions/2201241

  •  18-09-2019
  •  | 
  •  

문제

나는 그것이 왜 그렇게하는지 이해하지만 그것을 막는 방법에 대한 전혀 모른다. 따라서 시나리오는, 특정 프레임의 특정 프레임은 사전 정의 된 특정 픽셀로 자동차를 움직입니다. 어떤 일이 일어나는지 느리거나 빠른 컴퓨터를 계속 진행할 때 ... 글쎄, 나는 자동차가 느리거나 빠르게 움직일 수 있도록 초당 적은 프레임을 얻을 수 있습니다. 나는 그것을 어떻게 막을 수 있는지 궁금했다.

나는 어떤 도서관을 사용하는 것과 같은 문제를 겪을 것이라고 생각합니다 ... 이것은 처음으로 실시간으로 그런 일을하는 것입니다.

도움이 되었습니까?

해결책

나는 당신의 현재 코드가 어떻게 든 이렇게 보인다고 생각합니다

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

그러나 그것은 다음과 같아야합니다.

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

물론 타이머 이벤트를 설정해야합니다.

다른 팁

타이머에 따라 자동차를 움직이지 않고 프레임을 움직입니다. IE 자동차 모델은 디스플레이 표현과 무관해야합니다.

정확한 타이머와 벡터 수학을 사용하여이를 해결할 수 있습니다.

따라서 논쟁을 위해서는 드로잉 코드가 언제라도 1 초 간격으로 또는 3 초 간격으로 또는 0.02 초 간격으로 호출 될 수 있습니다.

자동차 이동 속도를 초당 40 픽셀로 가져 가십시오.

따라서 이동해야 할 픽셀의 수는 (time_now -last_frame_time) * 40px입니다.

움직임은 "실제"시간 지연으로 제한되어야합니다. 즉, 자동차는 시간 슬라이스 당 x 픽셀의 속도로 움직입니다.

실시간 시계를 읽고 경과 시간 동안 적절한 거리를 차를 이동하십시오. 컴퓨터가 너무 느리면 CPU 속도와 무관하게 자동차 속도를 만듭니다.

프레임 속도를 초당 X 프레임으로 캡처해야합니다 (60fps가 가장 일반적 임). 이것은 SFML을 포함한 대부분의 멀티미디어 프레임 워크에서 공통적 인 기능입니다. SFML의 경우 Window/RenderWindow 메소드를 살펴 보겠습니다. setframeratelimit (부호없는 int 한계).

당신은 필요합니다 타임 스텝을 수정하십시오. 기본적으로, 당신이 자동차를 이동하는 모든 프레임은 마지막 업데이트 호출 이후 실제로 경과 한 시간에 따라 다른 거리를 차를 움직입니다. 이런 식으로, 당신은 프레임 속도에 관계없이 올바른 속도를 얻습니다.

자동차와 그림을 움직이기 전에 시간을 절약해야합니다.
모든 계산 후 시간을 절약하십시오.
차를 npixels/second로 움직입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top